精华内容
下载资源
问答
  • 安装Anaconda Python集成环境下载环境anaconda下载选择安装环境下载过程中使用默认,但有一个页面需要确认,如下图。anaconda选择页面第一个勾是是否把 Anaconda 加入环境变量,这涉及到能否直接在 cmd中使用 conda...

    友情提示:此篇文章大约需要阅读 7分钟57秒,不足之处请多指教,感谢你的阅读。

    安装Anaconda Python集成环境

    下载环境

    anaconda下载选择

    安装环境

    下载过程中使用默认,但有一个页面需要确认,如下图。

    anaconda选择页面

    第一个勾是是否把 Anaconda 加入环境变量,这涉及到能否直接在 cmd中使用 conda、jupyter、 ipython 等命令,推荐打勾。

    第二个是是否设置 Anaconda 所带的 Python 3.6 为系统默认的 Python 版本,可以打勾。

    安装完成后,在开始菜单中显示“Anaconda2”如下图所示。

    安装显示界面

    安装第三方程序包 Graphviz

    目的是在决策树算法中八进制最终的树结构。

    1、打开 Anaconda Prompt ,输入 conda install python-graphviz,回车即可完成安装,如下图所示,本图所示已经安装 了 graphviz包,若之前没有安装,这时会花点时间安装,安装不用干预。

    安装决策树依赖包

    安装完成后先输入 python,然后再输入 import graphviz,测试是否成功安装,如上图所示。

    需要设置环境变量,才能使用新安装的 graphviz。

    Anaconda及依赖包环境变量设置

    首先查看 anaconda安装在哪个目录下,可以打开 Spyder的属性,看一看目标是什么目 录。例如本机的 anaconda安装路径为 C:\Users\lenovo\Anaconda2。

    下面设置环境变量

    (1) 在用户变量“path”里添加 C:\Users\lenovo\Anaconda2\Library\bin\graphviz

    (2) 在系统变量的“path”里添加 C:\Users\lenovo\Anaconda2\Library\bin\graphviz\dot.exe

    (3) 如果现在有正在打开的 anaconda 程序,例如正在 Spyder,那么关闭 Spyder,再启动,这 样刚才设置的环境变量生效。

    决策树分析

    格式化原始数据

    将下图的表 demo输入到 Excel中,保存为.csv 文件(.csv为逗号分隔值文件格式)。

    注意将表 demo中的汉字值转换成数据字值,例如“是否是公司职员”列中的“是”为“1”, “否”为“0”。转换后的表中数据如下图所示。

    学习表

    编写数据分析代码

    编写程序对上面的数据进行决策树分类,采用信息熵(entropy)作为度量标准。参考代码如下所示:

    from sklearn.tree import DecisionTreeClassifier,export_graphviz

    import graphviz

    import csv

    dataset = []

    reader = csv.reader(open("demo.csv"))

    for line in reader:

    if reader.line_num == 1:

    continue

    dataset.append(line)

    X = [x[0:4] for x in dataset]

    y = [x[4] for x in dataset]

    clf = DecisionTreeClassifier(criterion='entropy').fit(X, y)

    dot_data = export_graphviz(clf, out_file=None)

    graph = graphviz.Source(dot_data)

    graph.render("table");

    digraph Tree {

    node [shape=box] ;

    0 [label="X[0] <= 0.5\nentropy = 0.94\nsamples = 14\nvalue = [9, 5]"] ;

    1 [label="X[1] <= 1.5\nentropy = 0.985\nsamples = 7\nvalue = [3, 4]"] ;

    0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;

    2 [label="entropy = 0.0\nsamples = 3\nvalue = [0, 3]"] ;

    1 -> 2 ;

    3 [label="X[1] <= 2.5\nentropy = 0.811\nsamples = 4\nvalue = [3, 1]"] ;

    1 -> 3 ;

    4 [label="entropy = 0.0\nsamples = 2\nvalue = [2, 0]"] ;

    3 -> 4 ;

    5 [label="X[3] <= 0.5\nentropy = 1.0\nsamples = 2\nvalue = [1, 1]"] ;

    3 -> 5 ;

    6 [label="entropy = 0.0\nsamples = 1\nvalue = [1, 0]"] ;

    5 -> 6 ;

    7 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1]"] ;

    5 -> 7 ;

    8 [label="X[1] <= 2.5\nentropy = 0.592\nsamples = 7\nvalue = [6, 1]"] ;

    0 -> 8 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;

    9 [label="entropy = 0.0\nsamples = 4\nvalue = [4, 0]"] ;

    8 -> 9 ;

    10 [label="X[3] <= 0.5\nentropy = 0.918\nsamples = 3\nvalue = [2, 1]"] ;

    8 -> 10 ;

    11 [label="entropy = 0.0\nsamples = 2\nvalue = [2, 0]"] ;

    10 -> 11 ;

    12 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1]"] ;

    10 -> 12 ;

    }

    数据分析结果

    程序运行结果在与该程序在同一目录下的 table.pdf 文件中,将每一个叶子结点转换成IF-THEN 规则。

    决策树分析结果

    IF-THEN分类规则

    (1)IF"不是公司员工" AND "年龄大于等于40", THEN "不买保险"。

    (2)IF"不是公司员工" AND "年龄小于40", THEN "买保险"。

    (3)IF"不是公司员工" AND "年龄大于50" AND "信用为良", THEN "不买保险"。

    (4)IF"不是公司员工" AND "年龄大于40" AND "信用为优", THEN "买保险"。

    (5)IF"是公司员工" AND "年龄小于50", THEN "不买保险"。

    (6)IF"是公司员工" AND "年龄小于50" AND "信用为优", THEN "买保险"。

    (7)IF"是公司员工" AND "年龄小于50" AND "信用为良", THEN "不买保险"。

    展开全文
  • 这次数据分析的案例是,经典的数据分析案例——泰坦尼克号生还预测。本案例的分析思路包括以下三个部分:数据集描述与来源展示数据分析过程明确分析问题、理解数据数据清洗数据探索性分析数据建模与分析模型选择与...

    这次数据分析的案例是,经典的数据分析案例——泰坦尼克号生还预测。本案例的分析思路包括以下三个部分:

    • 数据集描述与来源展示
    • 数据分析过程
      • 明确分析问题、理解数据
      • 数据清洗
      • 数据探索性分析
      • 数据建模与分析
      • 模型选择与结果输出
    • 数据分析总结

    数据集描述与来源

    6a28d03c45f23b952411682e47a323e2.png

    这次的数据是Kaggle官方提供的Titanic:Machine Learning from Disaster。Titanic : Machine Learning from Disaster kaggle平台官方对这份数据集的定位是机器学习的入门级比赛项目(Get_started),是适合新接触机器学习的数据分析人员进行操作实践并了解机器学习基础知识的一个分析项目。

    当然Titanic也是我接触数据分析实践的第一个项目,在项目中我有学习到数据分析的整体思路与框架,也学到了一些数据分析操作,如:对数据集进行清洗,数据特征提取、数据分析建模等。也通过kaggle社区,补充了模型优化与参数调整部分知识。Titanic确实适合入门分析者进行分析实践,本次的案例分析,是我在Kaggle上提交过数据集,并在社区内去找高精确率的分析方法学习后,独立完成的。

    Titanic提供了两组数据,分别是“训练集”与“测试集”数据,虽然是称为训练集和测试集数据,但测试集数据其实是需要进行预测的数据集,其中的“生存状况”列数据是确实状态需要补足用于提交分析分析结果。两份数据都包含了10个数据字段。具体字段及其含义如图1。

    1415489bed149606e4101506c8b54717.png
    表1:数据字段及含义

    数据分析过程

    数据分析过程包括五部分:明确分析问题理解数据、数据清洗、数据探索性分析、数据建模与分析、模型优化与可视化展示

    9a5b35887643467592ed329a15110b32.png
    案例分析流程

    一、明确分析问题、理解数据

    1.1明确分析问题

    Titanic的分析问题,其实已经给定了,是一个二分类问题,需要使用机器学习知识搭建一个分类器,通过对数据集的学习,能够基于测试集数据给出生还预测。即,告知一部分的乘客信息(性别、年龄、座位等级、同乘的父母子女与兄弟姊妹等)与生还状态,能否基于对此信息进行学习与建模,用以预测另一批乘客的生还状态。

    1.2理解数据

    第一步还是先导入数据分析中需要用到的模块

    #导入基础模块
    

    再将数据集下载至jupyter 操作的Titanic项目文件夹下,用python打开训练集与测试集数据,为了方便数据清洗步骤操作,现将两份数据归为统一列表中,并输出两个数据集的结构信息,字段信息,粗略浏览数据信息。

    #导入数据
    

    test数据集的数据结构为:(418,11)。有418条记录,包含11个数据字段。

    fbc179de56331020da3c64fcc652d342.png
    test集的字段信息

    b1a4b1f54350956b6151f82d3235ea89.png
    test数据集预览

    训练集的数据结构为:(891,12),891条数据记录,12个数据字段,其中相对于test多出的字段为Survival也就是生还状况,需要预测的数据。

    6b378622ca0cbec1ba9e03b777065758.png
    train集数据信息

    7156eb7ed9ff96395b153e9d6ba8c5d2.png
    train集数据预览

    首先需要划分出数据类型

    • 离散型的数据有:Pclass、Sex、Embarkded、PassengerId、SibSp、Parch;
    • 连续性的数据有:Age、Fare;
    • 文字形式信息有:Name、Ticket、Cabin。

    根据数据内容信息,进行数据理解

    • 我们认为PassengerId为乘客编号其信息量较少不适合作为数据分析的特征,但其编号唯一可将其设置为数据集的Index;
    • Pclass、Sex、Embarkded等信息需要构建虚拟变量,可以用one-hot编码构建特征加入模型分析中;
    • Age信息代表具体年龄,但年龄对于生还来说,我们认为不同年龄区间的取值对结果的贡献是不一样的而不是具体的年龄数值,因此需要进行离散化;
    • SibSp、Parch特征都代表了同行的人员数量,我认为两个特征对于生还的影响可能是不同向的因此暂时不将特征合并看探索性分析的结果,Fare也留到探索性分析再进行相关处理;
    • 而Name特征根据仔细观察,名字中含有乘客的头衔,如Master其包含了乘客社会地位信息很可能影响结果预测,因此需要提取出头衔特征;
    • Ticket毫无规律无法找到有用的信息可以在数据清洗阶段剔除。

    最后对比两个数据集中的缺失值信息。

    • train数据集中,Age字段缺失177条记录,Embarked缺失2条记录,Cabin大量缺失数据仅有204条记录。
    • test数据集中,Age缺失86条记录,Fare缺失1条记录,而Cabin同样大量缺失数据仅有91条记录。

    最后说明下提交文件的要求,提交文件预览结果只有两列,其中第一列为PessengerId,第二列为Survival信息,1或0,int64类型数据。

    二、数据清洗

    2.1缺失值处理

    根据数据理解的信息,需要处理的缺失值为train中的Age、Embarked、Cabin,test中的Age、Fare、Cabin。为了增加容错,此处用test与train的copy集进行清洗。

    #缺失值处理
    
    #数据备份并装入清洗列表中
    data_cleaner = []
    data_test = test.copy()
    data_train = train.copy()
    data_cleaner.append(data_train)
    data_cleaner.append(data_test)
    
    #查看数据集中的数据分布状况,提供填充值选择思路
    for data in data_cleaner:
        data[['Age']].hist()
        print(data[['Age']].mean())

    5f181ae51668733d48f0b8b20ccd0fe5.png
    train和test集中的Age数据分布图(左train)

    两个数据集中的Age数据都近似呈正态分布,输出的年龄均值分别为29.70,30.27。从以上分布直方图中看一看出包含平均值的年龄区间内样本量最多而两侧样本量则随着与平均值的差距的绝对值的增加,其样本量也在逐渐减少,因此对于Age数据的缺失值,优先用平均值填充。

    #填充缺失值
    

    6b827e45cf501a528a471aca3a100a7c.png
    train和test填充后的分布图

    填充后数据集中 Age数据字段分别891条和418条,不存在缺失值。

    #同样查看test中的Fare
    test[['Fare']].hist()
    print(test[['Fare']].mean())

    981bd63e99dc3435cf303e58dc99ba30.png
    Fare数据分布图

    Fare的数据分布左倾,主要因为存在大量的离群值,大多数数据处于0-100之间,而最大值则是出现在了500左右。因此对于此类数据我们填充中位数保证数据的严谨。

    #填充中位数
    data_test[['Fare']] = data_test[['Fare']].fillna(data_test['Fare'].median())
    data_test[['Fare']].info()

    Fare字段418条记录,不存在缺失值。

    #查看Embarked 字段
    print(data_train[['Embarked']].head(20))
    #Embarked字段主要有S、C、Q三种取值,我们用众数填充
    data_train[['Embarked']] = data_train[['Embarked']].fillna(data_train['Embarked'].mode())
    data_train[['Embarked']].info()

    Embarked字段891条记录,不存在缺失值。

    #查看Cabin字段数据
    for data in data_cleaner:
        print(data[['Cabin']].head(50))

    Cabin数据大多数都存在缺失,而有的又存在多个房间,数据较为杂乱,为了防止填充值影响最终结果先为Cabin填充为‘Unknown’。

    #填充Unknown
    for data in data_cleaner:
        data[['Cabin']] = data_test[['Cabin']].fillna('Unknown')
        data[['Cabin']].info()

    train集891条记录、test集418条记录,无缺失值。

    2.2异常值处理

    #查看特征的分布状况
    for data in data_cleaner:
        print(data.describe())

    748e393dac8c27f9e6fdc6190d4e615e.png
    train集数据分布

    c10ab2e23f9037f2526914095560651b.png
    test集数据展示

    异常值主要出现在连续型特征中,

    #使用matplotlib 画箱型图
    
    #先看Age字段箱型图
    plt.figure(figsize = (10,6))
    plt.subplot(121)
    data_train[['Age']].boxplot()
    plt.title('train Age boxplot')
    plt.subplot(122)
    data_test[['Age']].boxplot()
    plt.title('test Age boxplot')
    plt.grid(alpha = 0.3)
    plt.show()

    efb4924c547fd3a1ce98cf429512cbad.png
    Age箱型图

    图中看出,Age数据存在很多在上界与下界之外的数据记录,但这些记录并不违反常识,年龄都在0岁以上和85岁以下,都是在正常的年龄分为内。

    #为了保证数据的可靠性,我们还是查看小于Age下界的记录数据
    for data in data_cleaner:
        IQR = data[['Age']].quantile(0.75)-data[['Age']].quantile(0.25)
        DB = data[['Age']].quantile(0.25) - 1.5*IQR
        print(data.loc[data['Age']< DB ,:])

    c804971da5de3ced65adae2aa99597b2.png
    train Age数据小于下界的记录

    c630625b5b70ad9bb6321e9e80cccbec.png
    test集Age数据小于下界的记录

    对比数据记录,不存在异常值。

    除去Age外,还有Fare特征需要排除异常值,Fare在之前的直方图中存在很多的离群值,因此也同样画出箱型图,并查看异常值。

    #Fare数据箱型图与异常值查询
    

    bbce918c51435a8a45cb1425b3754481.png
    Fare 箱型图

    79af1cbb9a67b7981d109e913ab7e430.png
    Fare散点分布图

    图看出Fare大多数数据在0-50,少部分在150左右,更少的在250,还有4个在500+,从横向看离群点的值都在较近的分布区间,另外根据观察数据发现Fare较高的人都是预订了多个房间,因此尽管有大量数据超过上界Fare的取值扔是合理的,(就像天价演唱会门票,如果也用箱型图,相信也是类似的分布状态。)

    这部分通过图表与查询验证 数据中不存在异常值。

    2.3数据预处理

    2.3.1离散化

    Age与Fare存在很多值在上界与下界之外,数据分布较分散,为了提升模型拟合程度,将此部分信息进行离散化,分到多个数值区间,减少数值计算能提升模型运算的速度,也能提升模型的拟合度。因此对Age与Fare进行离散化。普通离散化常用qcut与cut函数进行自动的离散化,但通过散点图我们从Fare分布,能看出数据大致类别,因此用列表[0,50,100,200,300,600]对Fare进行离散化。

    #为了观察Age是否分布也存在一定规律,决定画出Age散点图
    # Age散点图
    i = 0
    plt.figure(figsize=(10,6))
    namelist = ['train','test']
    for data in data_cleaner:
        i += 1
        plt.subplot(1,2,i)
        plt.scatter(data['PassengerId'],data['Age'])
        plt.title('{} scatter'.format(namelist[i-1]))
        plt.grid(alpha = 0.3)
    plt.show()

    b099843576a6f4389a419fbc6a340a64.png
    Age分布散点图

    Age数据分布没有比较明显的类别信息,因此用qcut对数据进行自动离散化分类。

    #离散化
    
    for data in data_cleaner:
        data['Agebin'] = pd.qcut(data['Age'],4)
        data['Farebin'] = pd.cut(data['Fare'],[0,50,100,200,300,600],labels=['A','B','C','D','E'])

    2.3.2删除不需要的数据

    上文提到数据集中的不必要字段为:Ticket,其对分析结果没有作用需要删除

    #删除 Ticket
    for data in data_cleaner:
        data = data.drop(columns=['Ticket'])

    2.4特征提取

    此部分需要对离散型数据(Agebin、Farebin、Embarked、Sex、Pclass)进行onehot编码,提取Name数据中信息字段,对SibSp和Parch进行特征提取,Cabin数据房间号类别提取。

    2.4.1 Name数据字段特征提取

    #Name字段的常规结果为:'名字,头衔.姓氏',有效特征为头衔
    for data in data_cleaner:
        data['Head'] = data['Name'].str.split(',').apply(lambda x:x[1].split('.')[0])
    #查询Head包含的值
    for data in data_cleaner:
        print(data['Head'].value_counts())
    #存在量很少的统计值,将其替换成‘N’
    for data in data_cleaner:
        H_values = data['Head'].value_counts()
        for i in H_values[H_values<10].index:
            data.loc[data['Head'].str.contains(i),'Head'] = 'N'

    2.4.2 放弃 SibSp、Parch数据字段

    我认为是否有父母子女同乘是会导致过拟合的特征数据,。例如,有年迈的父母与有壮年的子女,同样是计数1但对模型的影响结果,方向是相反的,而且这种作用相反的例子不止一种,因为父母可能有年迈的可能有中年的有青年的,子女有婴儿或青壮年,因此这类数据如果用于分析,其对结果的影响,取决于不同作用样本量的期望值,这类数据或许与结果有相关关系,但是在没有较好的控制变量的情况下是不存在因果关系的。因此,除非样本集过于特殊,否则两项放入模型中会导致模型过拟合。兄弟姐妹同行人数,我认为也是这种情况。因此先不将两个特征放入模型。

    2.4.3将Cabin房间类型取出

    for data in data_cleaner:
        data['Cabin_c'] = data['Cabin'].str[0:1]

    2.4.4 Onehot编码构建虚拟变量

    #进行onehot编码,但数据编码后放入模型会很麻烦,因此建立列表进行管理
    x_dummy_columns = ['Agebin','Farebin','Head','Embarked','Sex','Cabin_c','Pclass']
    data_train_dummy = pd.get_dummies(data_train[x_dummy_columns])
    data_test_dummy = pd.get_dummies(data_test[x_dummy_columns])

    三、数据探索性分析

    探索性分析中需要用到的数据为train集,因探索性分析需要Survival数据用于衡量各特征值对Survival数据的影响。

    3.1相关性分析

    #相关性分析
    data_train.set_index(['PassengerId'])
    
    # 设置标签
    lable = preprocessing.LabelEncoder()
    data_train['Sex_Code'] = lable.fit_transform(data_train['Sex'])
    data_train['Agebin_Code'] = lable.fit_transform(data_train['Agebin'])
    data_train['Farebin_Code'] = lable.fit_transform(data_train['Farebin'])
    data_train['Head_Code'] = lable.fit_transform(data_train['Head'])
    data_train['Embarked_Code'] = lable.fit_transform(data_train['Embarked'])
    
    print(data_train.corr()[['Survived']].sort_values(by = 'Survived',ascending= False))

    778532521b0bbd2e18f488d840d309d8.png
    与Survived相关系数

    3.2可视化

    为了更清晰展示各变量对Survived的影响进行可视化的展示

    #Survived hist
    plt.figure(figsize=(18,12))
    
    #Fare
    plt.subplot(221)
    plt.hist(x = [data_train.loc[data_train['Survived'] == 0,'Fare'],data_train.loc[data_train['Survived'] == 1,'Fare']],label = ['died','Survived'],color = ['red','green'])
    plt.grid(alpha = 0.3)
    plt.title('Fare Survived hist')
    plt.xlabel('Fare')
    plt.ylabel('Survived')
    plt.legend()
    
    #Age
    plt.subplot(222)
    plt.hist(x = [data_train.loc[data_train['Survived'] == 0,'Age'],data_train.loc[data_train['Survived'] == 1,'Age']],label = ['died','Survived'],color = ['red','green'])
    plt.grid(alpha = 0.3)
    plt.title('Age Survived hist')
    plt.xlabel('Age')
    plt.ylabel('Survived')
    plt.legend()
    
    
    #Pclass
    plt.subplot(223)
    plt.hist(x = [data_train.loc[data_train['Survived'] == 0,'Pclass'],data_train.loc[data_train['Survived'] == 1,'Pclass']],label = ['died','Survived'],color = ['red','green'])
    plt.grid(alpha = 0.3)
    plt.title('Pclass Survived hist')
    plt.xlabel('Pclass')
    plt.ylabel('Survived')
    plt.legend()
    
    
    #Embarked
    plt.subplot(224)
    plt.hist(x = [data_train.loc[data_train['Survived'] == 0,'Embarked'],data_train.loc[data_train['Survived'] == 1,'Embarked']],label = ['died','Survived'],color = ['red','green'])
    plt.grid(alpha = 0.3)
    plt.title('Embarked Survived hist')
    plt.xlabel('Embarked')
    plt.ylabel('Survived')
    plt.legend()
    
    plt.show()

    85d688309c828fe37ae1b9afa07b9607.png
    不同维度细分下的存活状况(红色为死亡,绿色为存活)

    对于探索性分析的目的主旨,理解还不够充分,缺少系统,结构化的思路进行深入探索,这部分就不过多陈述,等有一定探索性分析思路后再回来补充。

    四、数据建模与分析

    数据建模与分析部分需要将案例用到的机器学习算法定义出来,并用拆分后的训练集去训练我们的算法分类器,并在最后用测试集对分类器进行评估(如,精确率,召回率,roc曲线等)

    4.1模型选择

    4.1.1模型建立

    #将需要使用的模型及需要网格搜索的参数提前设定
    # LogisticRegression
    LR_clf = LogisticRegression(max_iter= 3000)
    param_dict1 = {
        'penalty' : ['l1','l2'],
        'C':[0.1,0.5,1]
    }
    # DecisionTreeClassifier
    DT_clf = DecisionTreeClassifier(random_state=0)
    param_dict2 = {
        'max_depth':[3,4,5],
        'min_samples_leaf' : [1,2]
    }
    # MultinomialNB
    NBC_clf = MultinomialNB()
    para_dict3 ={
        'alpha' : [1.0]
    }
    # SVC
    SVC_clf = SVC()
    param_dict4 = {
        'C':[2,2.5,3],
        'kernel':['rbf','linear','poly']
    }
    # RandomForestClassifier
    RF_clf = RandomForestClassifier()
    param_dict5 = {
        'n_estimators' :range(80,200,4),
        'max_features':[2,4,6,8]
    }
    # # XGBClassifier  (带入网格搜索,优化参数时,一直报错:feature_names must be string,没找到合理的原因,先注释掉了)
    # XGB_clf = XGBClassifier()
    # param_dict6 = {
    #     'n_estimators':[50,100,200],
    #     'max_depth':[2,5,8],
    #     'learning_rate':np.linspace(0.01,2,20),
    #     'binary':['hinge']
    # }
    # KNeighborsClassifier
    KNN_clf = KNeighborsClassifier()
    param_dict6 = {
        'n_neighbors':[5]
    }

    4.2模型分析

    用网格搜索进行参数优化和选择,并储存准确率,模型与参数

    Model_list = [LR_clf,DT_clf,NBC_clf,SVC_clf,RF_clf,KNN_clf]
    param_list = [param_dict1,param_dict2,para_dict3,param_dict4,param_dict5,param_dict6]
    estimator = []
    params = []
    score = []
    scoring = make_scorer(accuracy_score)
    for i in range(6):
        clf_R = Model_list[i]
        parameters = param_list[i]
        grid = GridSearchCV(clf_R,parameters,cv = 5,scoring= scoring,n_jobs = 4)
        grid.fit(data_train_dummy,Y)
        temp = grid.best_estimator_
        estimator.append(temp)
        temp = grid.best_params_
        params.append(temp)
        temp = grid.best_score_
        score.append(temp)

    五、模型选择与结果输出

    5.1模型选择与预测

    for i in range(6):
        model = Model_list[i]
        model.fit(data_train_dummy,Y)
        y_predict = model.predict(data_train_dummy)
        roc = roc_auc_score(y_true=Y,y_score=y_predict)
        recall = recall_score(y_true=Y,y_pred=y_predict)
        print('算法模型:',estimator[i],'n')
        print('模型的roc:',roc,'n')
        print('模型的召回率:',recall,'n')
        print('模型测试精确率:',score[i],'n')
        print('-'*20)

    fc56ce585b7fc6a878b0ab5d7bbb7e8a.png
    模型、参数、精确率等信息

    f4830fe60ca9bfea8e9f8e57ddfa9a7e.png
    模型、参数、精确率等信息

    5.2结果输出

    对比各参数我们选择SVM模型作为最终模型对测试集数据进行预测。

    CLF = Model_list[3]
    results= CLF.predict(data_test_dummy)
    results = pd.DataFrame(results,columns = ['Survived'])
    test = pd.concat([test,results],axis = 1)
    results = test[['PassengerId','Survived']]
    results = results.set_index(['PassengerId'])
    results.to_csv('./Results.csv')

    最后将模型估计生存结果,最后将结果输出到csv文件并提交到Kaggle平台。

    90037d01203b705db04e40b21c1fc50c.png

    数据分析总结

    开篇有提到Titanic是我做过的第一份数据分析项目,第一次提交的结果也如上图,准确率仅有74.88%,第一次的分析操作中,只是用简单的LR模型进行拟合,并且数据清洗过程也存在很多不合理的地方。这次距离上次分析经过了2个月的时间,期间我丰富了自己机器算法知识(用到了更多的算法模型),并自主学习了,模型估计过程中的数据集挑选(交叉验证)、参数优化(网格搜索)的相关操作。这次准确率虽然只上涨到78.229%,但kaggle平台的项目排名却从89%到了22%,可见预测模型的优化是高投入低产出的过程,但在工作业务中,对模型的优化调整又是必不可少。因此,数据分析学习需要我们投入大量的时间精力去完善自己的分析思路(数据理解、特征筛选等)与算法操作(理论背景、python操作)。

    在此还是老规矩,总结一下本次案例的不足与需要进一步学习的方面:

    • 需要精通pandas模块操作,在数据清洗附近因代码错误耽误时间;
    • 探索性分析中,可视化图表展现不够,需要学习更多的可视化图表以及理解探索性分析的思路与框架,能为数据模型分析提供分析思路;
    • 在算法模型创建中,XGBoost分类器的建立错误仍未解决,需要找到代码的错误点,并学会分类器的使用;
    • 准确率78%,还能进一步的提升,提升方向:特征提取与模型优化能力。

    31b401a3798a781c4d93694703f30a51.png
    展开全文
  • 作者:Nature出品:AI机器思维“从数据处理基础扎实练习是数据分析数据挖掘的第一步”做一道好菜需要食材,好的食材需要经过优质的萃取提炼。食材的提炼过程包括选型、运输保鲜、加工清洗、按要求切菜等才能按菜谱...

    ed8cc99d3584573839da5bed8702b0ed.gif

    4eb81b8e5e43a535d03e19f239c2320f.png

    作者:Nature

    出品:AI机器思维

    从数据处理基础扎实练习是数据分析与数据挖掘的第一步

    做一道好菜需要食材,好的食材需要经过优质的萃取提炼。食材的提炼过程包括选型、运输保鲜、加工清洗、按要求切菜等才能按菜谱进行真正的做出一道口感美味的菜。大数据时代数据分析与数据挖掘关键的一步在处理食材,这里的各类数据就是我们的食材,选择优质的数据,经过深加工清洗,去伪纯真这个过程需要耗费很长时间,也需要更多的实践经验。根据多年经验,要想运用好数据,首先要研究学习对各种类型的数据进行处理(如各类数据库数据、EXCEL数据、TXT数据、DAT数据等等)。无论用那种语言做数据分析与数据挖掘,首先得有数据食材,对于数据分析与数据挖掘工具只是帮助我们更好的做出一道好菜,正如开车,那种车都能到达目的地,技术不同效率不同,安全系数也不同。数据分析与数据挖掘的工具目前主流的是SAS、python、R等。这些数据分析挖掘工具能对海量的数据进行处理分析与挖掘。业界中用到的数据量都超过GB级别,研究数据处理,学好数据处理是万里长征第一步,也是学习数据分析与数据挖掘的核心。练习基本功需要耐心和毅力,也需要学习方式。建议学习方式如下:○对各类数据每一种类型的数据处理根据案例学习并总结数据处理经验。○对数据处理生成能够被数据分析与数据挖掘工具的数据集进行二次加工处理,需要理解业务衍生业务数据指标,这是一个深加工的过程。根据数据分析和数据挖掘目标找几个案例真正落实,多加练习。○数据分析与数据挖掘的过程就是运用工具中已经内置好的数据分析工具以及函数包的过程,这个过程只是占了整个数据分析与数据挖掘的百分之三十的工作量,大部分时间都是在做数据处理的清洗工作。○数据分析报告可以研习案例写作,数据挖掘结果分析根据研习的案例学习。数据分析与数据挖掘真正上手的方式就是加大案例学习与实践,跟着案例手把手练习,才能真正掌握数据分析与数据挖掘的真谛。案例如下面是零售客户数据,文件名buy.txt,目前存放在我的个人文件夹    E:/testdata/buy.txt

    f63dda2ddb3ee61cda8896f9d7a42cef.png

    数据说明:数据中每列为面包、牛奶、奶酪、苹果和香蕉对此类数据研究客户交叉销售,根据客户购买行为判断客户在买其中一种食物时会购买那类食物,这样把客户可能购买概率最高的放在货架上相同的位置。因此处理数据是核心环节:下面是python3.7版本下数据处理程序,数据文件以”|”分割,处理数据时程序指明了分隔符。这里的x=np.loadtxt(dataset_filename,delimiter='|')语句中delimiter=’|’指明了数据以|分割,默认是以空格,如果以空格就需要这个参数了。
    importtnumpyas np
    dataset_filename=
    "E:/testdata/buy.txt"x=np.loadtxt(dataset_filename,delimiter='|')print(x[:6])
    查看数据处理的数据如下:

    3d2d949ca182f950f28d6c4c916b6625.png

    输出结果从横向和纵向看都可以,横着看,每次只看一行。第一行(0, 0, 0, 1,1)表示 第一条交易数据所包含的商品。竖着看,每一列代表一种商品。在我们这个例子中,这五种商品分别是面包、牛奶、奶酪、苹果和香蕉。从第一条交易数据中,我们可以看到顾客购买了苹果和香蕉,但是没有买面包、牛奶和奶酪。每个特征只有两个可能的值,1或0,表示是否购买了某种商品,而不是购买商品的数量。1 表示顾客至少买了该商品,0表示顾客没有买该种商品。我们要找出“如果顾客购买了商品X,那么他们可能愿意购买商品Y”这样 的规则。简单粗暴的做法是,找出数据集中所有同时购买的两件商品。找出规则后,还需要判断其优劣,我们挑好的规则用。规则的优劣有多种衡量方法,常用的是支持度(support)和置信度(confidence)。 支持度指数据集中规则应验的次数,统计起来很简单。有时候,还需要对支持度进行规范化,即再除以规则有效前提下的总数量。我们这里只是简单统计规则应验的次数。支持度衡量的是给定规则应验的比例,而置信度衡量的则是规则准确率如何,即符合给定条件(即规则的“如果”语句所表示的前提条件)的所有规则里,跟当前规则结论一致的比例有多大。计算方法为首先统计当前规则的出现次数,再用它来除以条件(“如果”语句)相同的规则数量。 接下来,通过一个例子来说明支持度和置信度的计算方法,我们看一下怎么求“如果顾客购买了苹果,他们也会购买香蕉”这条规则的支持度和置信度。如下面的代码所示,通过判断交易数据中sample[3]的值,就能知道一个顾客是否买了苹果。 这里,sample表示一条交易信息,也就是数据集里的一行数据。
    num_apple_purchases=0for sample in x:if sample[3]==1:
            num_apple_purchases+=
    1print("{0}people bought apples".format(num_apple_purchases))
    下面是程序执行后统计购买苹果的结果:

    fd2611fb078b2f744160a1ab94b74293.png

    同理,检测sample[4]的值是否为1,就能确定顾客有没有买香蕉。现在可以计算题目给定规则在数据集中的出现次数,从而计算置信度和支持度。 我们需要统计数据集中所有规则的相关数据。首先分别为规则应验和规则无效这两种情况创 建字典。字典的键是由条件和结论组成的元组,元组元素为特征在特征列表中的索引值,不要用 实际特征名,比如“如果顾客购买了苹果,他们也会买香蕉”就用(3, 4)表示。如果某个个体的条件和结论均与给定规则相符,就表示给定规则对该个体适用,否则如果通过给定条件推出的结论与给定规则的结论不符,则表示给定规则对该个体无效。 为了计算所有规则的置信度和支持度,首先创建几个字典,用来存放计算结果。这里使用defaultdict,好处是如果查找的键不存在,返回一个默认值。附件:以空格分隔数据案例,整个程序源代码,数据可以自己多创造几条,如需要数据文件请留言,跟着案例学习可以更好的体验应用价值,提供学习兴趣:

    624ec871f825cdd57a052a7849568f53.png

    运行结果如下:

    32203a95f2d2f37242492cb4c2f0c58b.png

    从排序结果来看,“顾客买苹果,也会买奶酪”和“顾客买奶酪,也会买香蕉”,这两条规 则的支持度和置信度都很高。超市可以根据这些规则来调整商品摆放位置。例如如果苹果促销,就在旁边摆上奶酪。但是香蕉和奶酪同时搞促销就没有多大意义了,因为我们发现购买奶酪的顾客中,接近66%的人即使不搞促销也会买香蕉——即使搞促销,也不会给销量带来多大提升。 从上面这个例子就能看出从海量的数据中进行数据挖掘的洞察力有多强大,帮助我们发现数据背后的信息提升决策依据,指导经营提升营收。人们可以用数据挖掘技术探索数据集中各变量之间的关系,寻找商业价值,商品组合价值,营销价值等。学好数据挖掘,数据处理是关键,其他就是引用统计学的方法以及机器学习的算法等!

    ——往期精彩——

    额度授予模型

    开启数据挖掘之旅——以Python应用案例讲解(NO1)

    信用风险评分卡研究(1)

    品玩SAS:电商平台销售数据分析——以英国电商平台为例

    P2P网贷用户数据分析——以拍拍贷为例

    a57bd288983c8a274325837259dcdeee.png

    如果您觉得文章不错,请点击右下角的在看支持我们!

    展开全文
  • python中字典的应用及案例分析今天我们带入一个新的数据类型,跟之前的学习的数据类型关系不大,但是是一种很实用的数据类型。字典:可能你觉得很陌生,这个字典不是咱们用来查询字义解释的“字典”。在其他语言中你...

    python中字典的应用及案例分析

    今天我们带入一个新的数据类型,跟之前的学习的数据类型关系不大,但是是一种很实用的数据类型。

    字典:可能你觉得很陌生,这个字典不是咱们用来查询字义解释的“字典”。在其他语言中你可能听过哈希,其实这是一样子的。

    字典的应用范围:举一个很简单的例子,当你需要写电话和联系方式的时候,或者花名册的时候,都是人名字加上电话号码,而人名字是固定的,后面内容是不固定的。

    8742efdcd3b82b9d5cd1c74d39ed0798.png

    打开百度App,看更多图片

    创建和使用字典:

    >>> phonebook={'xiaoming':'65','xiaohong':'50','xiaohei':'69'}

    格式:{键:值/项} 其中键(key)是唯一的,值/项(value)并不唯一。

    字典函数: dict : 可以根据序列,关键字创建字典。

    实例分析:

    >>> phonebook={'xiaoming':'65','xiaohong':'50','xiaohei':'69'}

    >>> print phonebook #输出完整字典

    {'xiaoming': '65', 'xiaohong': '50', 'xiaohei': '69'}

    >>> print phonebook.keys() #输出所有键

    ['xiaoming', 'xiaohong', 'xiaohei']

    >>> print phonebook.values()

    ['65', '50', '69'] #输出所有值

    >>> print phonebook['xiaohei']

    69 #输出xiaohei对应的值

    be115acc8480c6ff8df7dfd2f8477059.png

    字典的基本操作:

    len(d):返回字典d中(键--值对)的数量。

    d[k]:返回键K对应的值。

    d[k]=v 将值v关联到键K上。

    del d[k]: 删出键为k的项

    k in d:检查d中是否含有键为k的项。

    字典的格式化字符串:

    >>> kilogram={'xiaoming':'65','xiaohong':'50','xiaohei':'69'}

    >>> "xiaohei's weight is %(xiaohei)s." %kilogram

    "xiaohei's weight is 69."

    8406d8a8f4011bc8f80c4668c70d396d.png

    字典格式化可以用在html格式里面。

    >>> template ='''

    ...

    %(title)s

    ...

    ...

    %(title)s

    ...

    %(text)s

    ... '''

    >>> data = {'title':'My Home Page','text':'Welcome to my home page!'}

    >>> print template %data

    My Home Page

    My Home Page

    Welcome to my home page!

    由于篇幅问题,我们会在明天继续讲解字典的方法应用与实例,请继续关注!

    展开全文
  • 线性回归判断糖尿病 希望这篇文章对你有所帮助,尤其是刚刚接触数据挖掘以及大数据的同学,同时准备尝试以案例为主的方式进行讲解。如果文章中存在不足或错误的地方,还请海涵~ 同时这篇文章是我上课的内容,所以...
  • Rose今天分享一下CCA的相关原理以及Python应用,CCA在EEG等脑电数据的特征提取中使用很多,很有必要熟悉其原理。CCA典型相关分析CCA(canonical correlation analysis)利用综合变量对之间的相关关系来反映两组指标...
  • 数据类型转换及描述统计 # 数据读取 sec_cars = pd.read_table(r'F:\\python_Data_analysis_and_mining\\05\\sec_cars.csv', sep = ',') # 预览数据的前五行 print(sec_cars.head()) # 查看数据的行列数 print('数据...
  • 从事机器学习,数据分析,数据挖掘的同学们以及python使用者选择经典案例基于真实数据集,从数据预处理开始到建立机器学习模型以及效果评估,完整的讲解如何使用python及其常用库进行数据的分析和模型的建立。...
  • 原标题:Python数据分析案例—用户识别欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习、问答、求职,一站式搞定!对商业智能BI、大数据分析挖掘、机器学习,python,...
  • 作者:杨啊小强来源:Python数据科学修炼之路本案例的业务场景:假如你们公司投放广告的渠道很多,每个渠道的客户性质也可能不同,比如在优酷视频投广告和今日头条投放广告,效果可能会...
  • Python数据挖掘分析

    2018-07-30 16:21:43
    此文件夹里包含两本基于Python数据挖掘分析的书籍和一本Python爬虫简写。主要介绍了Python的基本理论和一些实践案例
  • Python进行数据分析的好处是,它的数据...而且Python数据抽取、数据收集整理、数据分析挖掘数据展示,都可以在同一种Python里实现,避免了开发程序的切换。这里就和大家分享我做的一个应用实例。解决问题:自...
  • Load Lib在这边提一下为什么要加import ...Load data和正常的套路一样,Id的没有什么卵用但是每个数据集都喜欢加的东西,因此我们弄死它就好了。Data StatisticsData Statistics是不能省略的部分,这部分能够首先让...
  • 行业案例课程是Python系列课程的高级部分,每门课程均会完整介绍一个行业或应用领域中数据分析/挖掘方法de构建和实施流程,相应分析思路与实施代码均可作为分析模板供学员在同类行业应用项目中直接套用。注意:初学...
  • 如果你经常用python做一些小的项目...下边献上22个函数构造练习,将会助力大家在数据挖掘分析方面更进一步!建议大家收藏此文,有时间在自己的环境里亲自跑一遍加深理解。01两个变量互换两个变量可以通过这种方式...
  • Python数据分析挖掘

    万人学习 2018-01-08 11:17:45
    围绕Python基础语法介绍、数据预处理、数据可视化以及数据分析挖掘......这些核心技能模块展开,帮助你快速而全面的掌握和了解成为一个数据分析师的所有必修功法。   三、数据采集篇: ...
  • 本行业案例课程为Python 3 数据分析系列课程的行业案例部分,学员请务必先观看课程介绍免费视频,确认已学习本课程所需Python分析技能。2. 本课程的核心目的是协助学员学习具体业务场景下的解决方案,为降低学员...
  • 概念聚类分析:是按照个体的特征将它们分类,让同一个类别内的个体之间具有较高的相似度,不同类别之间具有较大差异性无分类目标变量(Y)——无监督学习K-Means划分法、DBSCAN密度法、层次聚类法1、导入数据1 ...
  • 本课程基于Python3全程以真实案例驱动,带你科学系统地学习数据分析挖掘建模领域的科学思维、必会知识、常用工具、完整流程以及老师多年的经验技巧。让你轻松转行,快速胜任数据分析师岗位,逆袭成为数据掘金时代...
  • 基础篇介绍了数据挖掘的基本原理,实战篇介绍了一个个真实案例,通过对案例深入浅出的剖析,使读者在不知不觉中通过案例实践获得数据挖掘项目经验,同时快速领悟看似难懂的数据挖掘理论。读者在阅读过程中,应充分...
  • 第二课:公共交通运营数据分析案例实战某公共交通公司需要对运营数据进行挖掘分析,找出有用的信息以供决策之用。根据各线路的运营数据进行线路聚类,找出不同线路的发展特点。针对线路的历史...
  • 这是《Python数据挖掘课程》系列文章,也是我这学期大数据金融学院上课的部分内容。本文主要讲述和分享线性回归作业中,学生们做得比较好的四个案例,经过我修改后供大家学习,内容包括: 1.线性回归预测Pizza价格...
  • 2019-03-1520:14:57楚格介绍:Python 数据分析挖掘,快速入门的Python and Packet 工具使用方法,其次是解决方案的应用案例,最后是数据分析挖掘的思维价值。成长路上会遇到许多难题与困惑,知识就是不断学习与...
  • Python数据挖掘实战

    千人学习 2017-12-15 12:04:44
    Python数据挖掘技术系列视频培训教程基于真实数据集进行案例实战,使用Python数据科学库从数据预处理开始一步步进行数据建模。对于每个案例首先进行流程解读与数据分析,建立特征工程,详细解读其中每一步原理与...
  • 初学者快速掌握Python 数据分析数据挖掘(含机器学习)的思想和方法3.形成科学有效的知识和能力结构体系框架,为今后数据分析工作打下良好的基础二、课程特色1.全程没有艰深的公式,几乎全部以实际案例带动启发理解...
  • 3.4.2 分析数据分析数据的特征:TV:在电视上投资的广告费用(以千万元为单位);Radio:在广播媒体上投资的广告费用;Newspaper:用于报纸媒体的广告费用;响应:连续的值;Sales:对应产品的销量。在这个案例中,...
  • 本书以大家熟知的数据挖掘建模工具Python语言来展开,以解决某个应用的挖掘目标为前提,先介绍案例背景提出挖掘目标,再阐述分析方法与过程,最后完成模型构建,在介绍建模过程中穿插操作训练,把相关的知识点嵌入...
  • 基础篇介绍了数据挖掘的基本原理,实战篇介绍了一个个真实案例,通过对案例深入浅出的剖析,使读者在不知不觉中通过案例实践获得数据挖掘项目经验,同时快速领悟看似难懂的数据挖掘理论。读者在阅读过程中,应充分...
  • Python数据挖掘简易入门

    千人学习 2020-03-11 14:47:29
    本课程为Python数据挖掘方向的入门课程,课程主要以真实数据为基础,详细介绍数据挖掘入门的流程和使用Python实现pandas与numpy在数据挖掘方向的运用,并深入学习如何运用scikit-learn调用常用的数据挖掘算法解决...
  • 特征:数据的属性,通过这些特征可以代表数据的特点,例如Excel的字段列名,也叫做解释变量或自变量。标签:对数据的预测结果,也叫做因变量。 3.训练数据(train)和测试数据(tset): 训练数据:用于机器学习算法,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 807
精华内容 322
关键字:

python数据挖掘分析案例

python 订阅