2021-06-24

Task5 动手学数据分析

一、分析库的作用

import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import Image

对于matplotlib库与seaborn库的比较,Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython可以做一个根据花的种类定义好每种花的颜色的小测试;
Seaborn是基于matplotlib的图形可视化python包。它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。
Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。同时它能高度兼容numpy与pandas数据结构以及scipy与statsmodels等统计模式。
对于二者的区别,我们可以做一个根据花的种类定义好每种花的颜色的小测试。
Matplotlib:

```python
![for species, group in iris.groupby('Name'):
    plt.scatter(group\['PetalLength'\], group\['SepalLength'\],
                color=color_map\[species\],
                alpha=0.3, edgecolor=None,
                label=species)
plt.legend(frameon=True, title='Name')
plt.xlabel('petalLength')
plt.ylabel('sepalLength')

在这里插入图片描述

seaborn比matplotlib画散点图简单的多

```python
sns.lmplot('PetalLength', 'SepalLength', iris, hue='Name', fit_reg=False)

在这里插入图片描述

二、选择机器学习模型
①选择模型
构造预测模型的有监督学习(supervised learning);
构造描述性模型的无监督学习(un supervised learning)

监督学习:
通过已有的一部分输入数据与输出数据之间的对应关系,生成一个函数,将输入映射到合适的输出,例如分类。就是每次迭代开始前都有人为操控,比如限制条件或者数据处理。

非监督学习:
直接对输入数据集进行建模,例如聚类。给个迭代方程,让它自己运行。
②选择指标:根据任务和样本量以及数据特征的稀疏性来选择模型,这里我的建模,并不是从零开始,自己一个人完成完成所有代码的编译。而是使用一个机器学习最常用的一个库(sklearn)来完成我们的模型的搭建。

三、切割训练集和测试集
首先我们要了解数据集划分的三种方法:
①留出法:留出法”直接将数据集D划分为两个互斥的集合,一个为训练集S,一个为测试集T,即D=S∪T,S∩T=∅.在S上进行模型学习,然后用T来评估其测试误差,作为对泛化误差的估计。
单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行模型评估后取平均值作为留出法的评估结果。
代码示例:

mport random
import csv
import pandas as pd

def loadDataset(filename, split, trainingSet = [], testSet = []):
     with open(filename, 'r') as f:
         lines = csv.reader(f)
         dataset = list(lines)
         for x in range(len(dataset)-1):
             if random.random() < split:  #将数据集随机划分
                 trainingSet.append(dataset[x])
             else:
                 testSet.append(dataset[x])


if __name__ == "__main__":
    train = []
    test = []
    loadDataset('', 0.7, train, test)
    print(train)
    print(test)

    train2 = pd.DataFrame(data=train)
    train2.to_csv('')

    test2 = pd.DataFrame(data=test)
    test2.to_csv('')

②交叉验证法:
“交叉验证法”先将数据集D划分为k个大小相同的互斥子集,即D=D1∪D2∪⋯∪Dk,Di∩Dj=∅(i≠j).其中每个子集Di都应尽量保持数据分布的一致性,即从D中通过分层采样得到。
然后,每次都用其中的k−1个子集的并集作为训练集,余下一个作为测试集,这样就可以得到k组训练集/测试集,从而可以进行k次模型的学习,并把这k个测试结果的均值作为评估结果,通常我们把交叉验证法称为“k折交叉验证”。
将数据集D划分为k个子集存在多种划分方式;
为了减小因样 本划分不同而引入的差别,k折交叉验证可以随机使用不同的划分重复p次,最终的评估的结果是这p次k折交叉验证结果的均值
示例代码:

import csv
import pandas as pd

with open('titanic.csv', 'r') as f:
    lines = csv.reader(f)
    data_set = list(lines)
del(data_set[0])
length = len(data_set)//10
print(length)
data = []
for i in range(10):
    data.append(data_set[i*length:(i+1)*length])
data.append(data_set[10*length:])

print(data_set)
print(data)

③自助法:

在这里插入图片描述lim m趋近于无穷 (1- 1/m)的m次方=1/e ≈0.368
即通过自住法采样,数据集D中约有36.8%的样本未出现在数据集D′中,于是可以将D′ 用作训练集,D/D′用作测试集。

import numpy as np
#任意设置一个数据集
X = [1, 4, 3, 23, 4, 6, 7, 8, 9, 45, 67, 89, 34, 54, 76, 98, 43, 52]

#通过产生的随机数获得抽取样本的序号
bootstrapping = []
for i in range(len(X)):
    bootstrapping.append(np.floor(np.random.random()*len(X)))
#通过序号获得原始数据集中的数据
D_1 = []
for i in range(len(X)):
    D_1.append(X[int(bootstrapping[i])])

四、创建模型

代码过多不便展示了,大概说一下思路。
①创建基于线性模型的分类模型(逻辑回归),注意逻辑回归模型是分类模型而不是回归模型,与LinearRegRession不同

②创建基于树的分类模型(决策树、随机森林)
随机森林其实是决策树集成为了降低决策树过拟合的情况
线性模型所在的模块为sklearn.linear_ model

③树模型所在的模块为sklearn.ensemble
输出模型预测分类标签;
输出不同分类标签的预测概率;
一般监督模型在sklearn里面有个predict能输出预测标签, predict. proba则可以输出标签概率;

五、模型评估
1.为什么要进行模型评估呢?对于创建好的模型,我们需要对其进行评估了解他的泛化能力,就像软件上线之前要他的安装、卸载、升级测试;兼容性测试,PC和手机端,ios和android是否兼容 ;测试他的进程优先级;测试他的时间复杂度测试,以便后期进行优化。
2.评估指标
准确率(precision)度量的是被预测为正例的样本中有多少是真正的正例
召回率(recall)度量的是正类样本中有多少被预测为正类
f-分数是准确率与召回率的调和平均

3.交叉验证:

from sklearn.model_selection import cross_val_score
lr = LogisticRegression(C=100)
scores = cross_val_score(lr, X_train, y_train, cv=10)

在这里插入图片描述
结论:k折越多,平均误差被视为泛化误差这个结果就越可靠,但相应的所花费的时间也是线性增长的。

4.ROC曲线
第一次接触这个概念所以进行了拓展学习。
一 roc曲线
1、roc曲线:接收者操作特征(receiveroperating characteristic),roc曲线上每个点反映着对同一信号刺激的感受性。

横轴:负正类率(false postive rate FPR)特异度,划分实例中所有负例占所有负例的比例;(1-Specificity)

纵轴:真正类率(true postive rate TPR)灵敏度,Sensitivity(正类覆盖率)

2针对一个二分类问题,将实例分成正类(postive)或者负类(negative)。但是实际中分类时,会出现四种情况.

(1)若一个实例是正类并且被预测为正类,即为真正类(True Postive TP)

(2)若一个实例是正类,但是被预测成为负类,即为假负类(False Negative FN)

(3)若一个实例是负类,但是被预测成为正类,即为假正类(False Postive FP)

(4)若一个实例是负类,但是被预测成为负类,即为真负类(True Negative TN)

TP:正确的肯定数目

FN:漏报,没有找到正确匹配的数目

FP:误报,没有的匹配不正确

TN:正确拒绝的非匹配数目

列联表如下,1代表正类,0代表负类:
(1)真正类率(True Postive Rate)TPR: TP/(TP+FN),代表分类器预测的正类中实际正实例占所有正实例的比例。Sensitivity

(2)负正类率(False Postive Rate)FPR: FP/(FP+TN),代表分类器预测的正类中实际负实例占所有负实例的比例。1-Specificity

(3)真负类率(True Negative Rate)TNR: TN/(FP+TN),代表分类器预测的负类中实际负实例占所有负实例的比例,TNR=1-FPR。Specificity

假设采用逻辑回归分类器,其给出针对每个实例为正类的概率,那么通过设定一个阈值如0.6,概率大于等于0.6的为正类,小于0.6的为负类。对应的就可以算出一组(FPR,TPR),在平面中得到对应坐标点。随着阈值的逐渐减小,越来越多的实例被划分为正类,但是这些正类中同样也掺杂着真正的负实例,即TPR和FPR会同时增大。阈值最大时,对应坐标点为(0,0),阈值最小时,对应坐标点(1,1)。

在这里插入图片描述那么如何画roc曲线呢?
假设已经得出一系列样本被划分为正类的概率,然后按照大小排序,下图是一个示例,图中共有20个测试样本,“Class”一栏表示每个测试样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个测试样本属于正样本的概率。在这里插入图片描述接下来,我们从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。举例来说,对于图中的第4个样本,其“Score”值为0.6,那么样本1,2,3,4都被认为是正样本,因为它们的“Score”值都大于等于0.6,而其他样本则都认为是负样本。每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。这样一来,我们一共得到了20组FPR和TPR的值,将它们画在ROC曲线的结果如下图:
在这里插入图片描述AUC(Area under Curve):Roc曲线下的面积,介于0.1和1之间。Auc作为数值可以直观的评价分类器的好坏,值越大越好。

首先AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。

小结一下,我们能从Roc曲线得到什么信息呢?
①一个ROC曲线完全”包住“另一个ROC曲线—>第一个学习器效果更好;
② 两个ROC曲线相交—>利用ROC曲线下的面积(AUC,area under ROC curve,是一个数值)进行比较学习器的效果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值