Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

机器学习——python实践.笔记

2019/09/15 机器学习 Python
Word count: 3,679 | Reading time: 15min

机器学习——Python实践

  • Numpy:
    • python开源数值计算拓展,用来存储和处理大型矩阵,提供了许多高级的数值编程工具,如 矩阵数据类型、矢量处理、精密的运算库
      • 利用Numpy数组来准备机器学习算法的数据
  • matplotlib:
    • python中最著名的2D绘图库,适合交互式的进行制图;也可作为绘图空间,嵌入GUI应用程序中
      • 创建图表,展示数据
  • Pandas:
    • 基于Numpy的工具,为了解决数据分析任务而创建的.~纳入了大量库和标准的数据模型,提供了操作大型数据集的工具,和快速便捷处理数据的函数和方法
      • 导入、展示数据,以便挣钱对数据的理解和数据清洗、转换等工作

预测模型所需的六个步骤:

预测模型所需的六个步骤


第一章:

鸢尾花(Iris Flower)

  • 所有特征数据都是数字,不需要考虑如何导入和处理数据—>有的图表有标题等的,需要处理-

  • 分类问题===>监督学习算法

  • 多分类问题,可能需要一些特殊处理

  • 所有特征的数值采用相同单位,不需要进行尺度转换

步骤:

项目具体步骤

1.导入数据集
1
2
3
4
5
6
7
8
9
from pandas import read_csv
from matplotlib import pyplot
from sklearn.svm import SVC

filename = 'iris.data.csv'
names = ['separ-length','separ-width','petal-length','petal-width','class']
# 花萼长度+宽度 , 花瓣长度+宽度
dataset = read_csv(filename,names = names)
print(dataset) # 150 * 5
2.概述数据

从下列角度审查数据:

  • 数据的维度

  • 查看数据的自身

  • 统计描述所有的数据特征

  • 数据分类的分布情况

1.数据的维度

了解数据集中有多少行数据,数据有几个属性

1
2
print('数据的维度: 行 %s , 列 %s' % (dataset.shape))
#>>>数据的维度: 行 150 , 列 5
2.参看数据本身

直观的看到数据的特征,数据的类型,以及大概的数据分布范围

1
2
3
4
5
6
7
8
print(dataset.head(5))
>>>
separ-length separ-width ... petal-width class
0 5.1 3.5 ... 0.2 Iris-setosa
1 4.9 3.0 ... 0.2 Iris-setosa
2 4.7 3.2 ... 0.2 Iris-setosa
3 4.6 3.1 ... 0.2 Iris-setosa
4 5.0 3.6 ... 0.2 Iris-setosa
3.统计描述数据

数据特征的统计描述信息包括数据的行数中位值最大值最小值均值四分位值等统计数据信息

1
2
3
4
5
6
7
8
9
10
11
print(dataset.describe())
>>>
separ-length separ-width petal-length petal-width
count 150.000000 150.000000 150.000000 150.000000
mean 5.843333 3.054000 3.758667 1.198667
std 0.828066 0.433594 1.764420 0.763161
min 4.300000 2.000000 1.000000 0.100000
25% 5.100000 2.800000 1.600000 0.300000
50% 5.800000 3.000000 4.350000 1.300000
75% 6.400000 3.300000 5.100000 1.800000
max 7.900000 4.400000 6.900000 2.500000
4.数据分类分布

了解数据在不同分类的分布情况…==>每个分类数据量的绝对数值

1
2
3
4
5
6
7
print(dataset.groupby('class').size())
>>>
class
Iris-setosa 50
Iris-versicolor 50
Iris-virginica 50
dtype: int64

▲ 如果数据分布不平衡,可能会影响到模型的准确性,…==>不平衡时,需要对数据进行调整,方法有:

  • 扩大数据样本
    • 通常容易被忽略的选择…但往往找到更大的数据集就有可能挖掘出更平衡的方面提高算法准确度
  • 数据的重新抽样
    • 过抽样(复制少数类样本)…数据少时考虑
    • 欠抽样(删除多数类样本)…数据多时考虑
  • 尝试生成人工样本
    • 从少数类的实例中随机抽样特征属性,生成更多数据
  • 异常检测和变化检测
    • 尝试从不同观点思考,异常检测是对罕见事件的检测,将小类作为异常值类

3.数据可视化

单变量图表: 理解每一个特征属性

多变量图表: 理解不同特征属性之间的关系

单变量图:

箱线图: 一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。

主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比 较。箱线图的绘制方法是:先找出一组数据的最大值、最小值、中位数和两个四分位数;然后, 连接两个四分位数画出箱子;再将最大值和最小值与箱子相连接,中位数在箱子中间。

1
2
3
4
5
6
7
8
#箱线图 , 因为每个特征属性都是数字 , 所以 用箱线图展示 属性与中位值的离散程度
dataset.plot(kind='box',subplots = True,layout = (2,2) , sharex = False , sharey = False)
# 参数说明 : box箱线 , subplots 允许多个子图, layout 布局为2*2 , sharex.sharey 不共享x,y
pyplot.show()
#---
#直方图 , x轴为值 , y轴为数量
dataset.hist()
pyplot.show()
多变量图:
1
2
3
4
5
from pandas.plotting import scatter_matrix
#散点矩阵图
scatter_matrix(dataset)
pyplot.show()
#pyplot.savefig("scatter_matrix.png")

scatter_matrix

4.评估算法

  • 分离出评估数据集
  • 采用10折交叉验证来评估算法模型
  • 生成6个不同的模型来预测新数据
  • 选择最优模型
1.分离出评估数据集

❤️要想知道算法模型对真是数据的准确度,所以保留一部分数据来评估算法模型.

1
2
3
4
5
6
7
8
from sklearn.model_selection import train_test_split
array = dataset.values
X = array[:,0:4] #除了最后的class类别
Y = array[:,4] #类别,目标
validation_size = 0.2 #验证比例
seed = 7 #随机种子
X_train , X_validation , Y_train , Y_validation = \
train_test_split(X,Y,test_size=validation_size,random_state=seed)
2.评估模式

采用10折交叉验证来分离训练数据集 :

随机将数据分成10份,9份用来训练模型,1份用来评估算法

3.创建模型

线性

  • 线性回归(LR)
  • 线性判别分析(LDA)

非线性

  • K近邻(KNN)
  • 分类与回归树(CART)
  • 贝叶斯分类器(NB)
  • 支持向量机(SVM)

▲ 在每次对算法进行评估前都会重新设置随机数种子,以保证每次对算法的评估都是用相同的数据集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from sklearn.linear_model import LogisticRegression,LinearRegression #LR
from sklearn.tree import DecisionTreeClassifier #CART
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis #LDA
from sklearn.naive_bayes import GaussianNB #NB
from sklearn.neighbors import KNeighborsClassifier #KNN
from sklearn.svm import SVC #SVM
from sklearn.model_selection import KFold,cross_val_score
models = {}
models['LR'] = LogisticRegression()
models['LDA'] = LinearDiscriminantAnalysis()
models['CART'] = DecisionTreeClassifier()
models['NB'] = GaussianNB()
models['KNN'] = KNeighborsClassifier()
models['SVM'] = SVC()
#评估算法
resutls = []
for key in models:
kfold = KFold(n_splits=10,random_state=seed)
cv_result = cross_val_score(models[key],X_train,Y_train,cv = kfold , scoring = 'accuracy')
#cross_val_score将交叉验证的整个过程连接起来,不用再进行手动的分割数据, cv参数用于规定将原始数据分成多少份
resutls.append(cv_result)
print("%s: %f (%f)" % (key,cv_result.mean(),cv_result.std())) #均值,标准差
4.选择最优模型
1
2
3
4
5
6
7
>>>
LR: 0.966667 (0.040825)
LDA: 0.975000 (0.038188)
CART: 0.966667 (0.040825)
NB: 0.975000 (0.053359)
KNN: 0.983333 (0.033333)
SVM: 0.991667 (0.025000)
为什么使用 10折交叉验证?

进行模型验证的一个重要目的是要选出一个最合适的模型,对于监督学习而言,我们希望模型对于未知数据的泛化能力强,所以就需要模型验证这一过程来体现不同的模型对于未知数据的表现效果。

训练准确度==>测试准确度

最先我们用训练准确度(用全部数据进行训练和测试)来衡量模型的表现,这种方法会导致模型过拟合(方差大);===>>为了解决这一问题,我们将所有数据分成训练集和测试集两部分,我们用训练集进行模型训练,得到的模型再用测试集来衡量模型的预测表现能力,这种度量方式叫测试准确度,这种方式可以有效避免过拟合。

测试准确度==>10折交叉验证

测试准确度的一个缺点是其样本准确度是一个高方差估计(high variance estimate), 所以该样本准确度会依赖不同的测试集,其表现效果不尽相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
for i in xrange(1,5):
print "random_state is ", i,", and accuracy score is:"
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=i)

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
print metrics.accuracy_score(y_test, y_pred)
>>>
random_state is 1 , and accuracy score is:1.0
random_state is 2 , and accuracy score is:1.0
random_state is 3 , and accuracy score is:0.947368421053
random_state is 4 , and accuracy score is:0.973684210526

上面的测试准确率可以看出,不同的训练集、测试集分割的方法导致其准确率不同,而交叉验证的基本思想是:1.将数据集进行一系列分割,生成一组不同的训练测试集2.然后分别训练模型并计算测试准确率3.最后对结果进行平均处理。这样来有效降低测试准确率的差异。

K折交叉验证:
  1. 将数据集平均分割成K个等份子集
  2. 使用1份数据(子集)作为测试数据,其余(K-1)份作为训练数据
  3. 计算测试准确率
  4. 使用不同的测试集,重复2、3步骤
  5. 对测试准确率做平均,作为对未知数据预测准确率的估计 ==> cross_val_score.mean()

不同的训练集、测试集分割的方法导致其准确率不同,而交叉验证的基本思想是:将数据集进行一系列分割,生成一组不同的训练测试集,然后分别训练模型并计算测试准确率,最后对结果进行平均处理。这样来有效降低测试准确率的差异。

KFold

来自周志华<<机器学习>>:

K交叉验证法

分割方法
1
2
3
4
# 下面代码演示了K-fold交叉验证是如何进行数据分割的
# simulate splitting a dataset of 25 observations into 5 folds
from sklearn.cross_validation import KFold
kf = KFold(25, n_folds=5, shuffle=False)
1
2
cv_result  = cross_val_score(models[key],X_train,Y_train,cv = 10 , scoring = 'accuracy')
#cross_val_score将交叉验证的整个过程连接起来,不用再进行手动的分割数据, cv参数用于规定将原始数据分成多少份
5.实施预测
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#使用评估数据集评估算法
svm = SVC()
svm.fit(X = X_train ,y = Y_train) #参数为 X , y
predictions = svm.predict(X_validation)
print(accuracy_score(Y_validation,predictions)) #测试集结果 与 预测结果 相比
print(confusion_matrix(Y_validation,predictions))
print(classification_report(Y_validation,predictions))
>>>
0.9333333333333333
[[ 7 0 0]
[ 0 10 2] #混淆矩阵只出现了两个错误,2
[ 0 0 11]]
precision(精确度) recall(召回率) f1-score(F1值) support(总和)

Iris-setosa 1.00 1.00 1.00 7
Iris-versicolor 1.00 0.83 0.91 12
Iris-virginica 0.85 1.00 0.92 11

avg / total 0.94 0.93 0.93 30
召回率(Recall Rate,也叫查全率)

检索出的相关文档数文档库中所有的相关文档数的比率,衡量的是检索系统的查全率

精度(Precise)

检索出的相关文档数检索出的文档总数的比率,衡量的是检索系统查准率

  • TP: 预测为正,实际为正 (第一个是实际T或F,第二个是预测P或N)

  • FP: 预测为正,实际为负

  • TN:预测为负,实际为负

  • FN: 预测为负,实际为正

精确率、准确率:Accuracy=(TP+TN)/(TP+TN+FN+FP)

//精准率、查准率:P = TP/ (TP+FP)

召回率、查全率:R = TP/ (TP+FN)

F1-score: 2*TP/(2*TP + FP + FN)

◆. 精确度是“搜索结果有多大用处”,而召回是“结果如何完整”。


F1分数:

概述 : 统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的准确率召回率。F1分数可以看作是模型准确率召回率的一种加权平均,它的最大值是1,最小值是0。

人们通常使用准确率和召回率这两个指标,来评价二分类模型的分析效果。

但是当这两个指标发生冲突时,我们很难在模型之间进行比较。比如,我们有如下两个模型A、B,A模型的召回率高于B模型,但是B模型的准确率高于A模型,A和B这两个模型的综合性能,哪一个更优呢?

准确率 召回率
A 80% 90%
B 90% 80%

为了解决这个问题,人们提出了FβF_{\beta} 分数。FβF_{\beta}的物理意义就是将准确率和召回率这两个分值合并为一个分值,在合并的过程中,召回率的权重是准确率的 β\beta倍。F1F_{1}分数认为召回率和准确率同等重要F2F_{2} 分数认为召回率的重要程度是准确率的2倍,而分F0.5F_{0.5}数认为召回率的重要程度是准确率的一半

Fβ=(1+β2) precision recall(β2 precision )+recallF _ { \beta } = \left( 1 + \beta ^ { 2 } \right) \cdot \frac { \text { precision recall} } { \left( \beta ^ { 2 } \cdot \text { precision } \right) + \text {recall} }

β=recall rateaccuracy rate\beta = \frac { \text {recall rate} } { \text {accuracy rate} }

▲ 如何计算PreciseRecallF1-score见博客https://blog.csdn.net/akadiao/article/details/78788864


Confusion_martrix(混淆矩阵)

混淆矩阵: 一种特定的矩阵用来呈现算法性能的可视化效果,通常是监督学习(非监督学习,通常用匹配矩阵:matching matrix)

其每一列代表预测值,每一行代表的是实际的类别。这个名字来源于它可以非常容易的表明多个类别是否有混淆(也就是一个class被预测成另一个class)。

Example样例说明:

假设有一个用来对猫(cats)、狗(dogs)、兔子(rabbits)进行分类的系统,混淆矩阵就是为了进一步分析性能而对该算法测试结果做出的总结。假设总共有 27 只动物:8只猫, 6条狗, 13只兔子。结果的混淆矩阵如下图:

confusion_matrix

在这个混淆矩阵中,实际有 8只猫,但是系统将其中3只预测成了狗;对于 6条狗,其中有 1条被预测成了兔子,2条被预测成了猫。从混淆矩阵中我们可以看出系统对于区分猫和狗存在一些问题,但是区分兔子和其他动物的效果还是不错的所有正确的预测结果都在对角线上,所以从混淆矩阵中可以很方便直观的看出哪里有错误,因为他们呈现在对角线外面。****

Author: Mrli

Link: https://nymrli.top/2018/11/23/机器学习——Python实践-笔记/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
机器学习——数学概念
NextPost >
Pycharm里无法查看Sqlite数据表
CATALOG
  1. 1. 机器学习——Python实践
    1. 1.0.0.0.1.
  • 1.1. 第一章:
    1. 1.1.1. 鸢尾花(Iris Flower)
      1. 1.1.1.0.1. 1.导入数据集
      2. 1.1.1.0.2. 2.概述数据
        1. 1.1.1.0.2.1. 1.数据的维度
        2. 1.1.1.0.2.2. 2.参看数据本身
        3. 1.1.1.0.2.3. 3.统计描述数据
        4. 1.1.1.0.2.4. 4.数据分类分布
    2. 1.1.1.1. 3.数据可视化
      1. 1.1.1.1.1. 单变量图:
      2. 1.1.1.1.2. 多变量图:
    3. 1.1.1.2. 4.评估算法
      1. 1.1.1.2.1. 1.分离出评估数据集
      2. 1.1.1.2.2. 2.评估模式
      3. 1.1.1.2.3. 3.创建模型
      4. 1.1.1.2.4. 4.选择最优模型
      5. 1.1.1.2.5. 为什么使用 10折交叉验证?
        1. 1.1.1.2.5.1. 训练准确度==>测试准确度
        2. 1.1.1.2.5.2. 测试准确度==>10折交叉验证
      6. 1.1.1.2.6. K折交叉验证:
        1. 1.1.1.2.6.1. 分割方法
      7. 1.1.1.2.7. 5.实施预测
        1. 1.1.1.2.7.1. 召回率(Recall Rate,也叫查全率)
        2. 1.1.1.2.7.2. 精度(Precise)
        3. 1.1.1.2.7.3. F1分数:
  • 1.1.2. Confusion_martrix(混淆矩阵)
    1. 1.1.2.1. Example样例说明: