环境部署
Scikit-learn
Python语言中专门针对机器学习应用而发展起来的一款开源框架(算法库),可以实现数据预处理、分类、回归、降维、模型选择等常用的机器学习算法
特点:集成了机器学习中各类成熟的算法,容易安装和使用,样例丰富,教程和文档也非常详细
不支持Python之外的语言,不支持深度学习和强化学习
安装:https://scikit-learn.org/stable/install.html
数据预处理
Iris数据集:
Iris鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例,属于监督式学习;
数据集分3类共150条记录,每类各50个数据
每条记录都有4项特征:花萼长度(Sepal Length)、花萼宽度(Sepal Width)、花瓣长度(Petal Length)、花瓣宽度(Petal Width)
通过这4个特征预测鸢尾花卉属于(iris-setosa、iris-versicolour、iris-virginica)中的哪一品种。
操作步骤:
iris数据加载
# coding:utf-8
# iris数据加载
from sklearn import datasets
iris = datasets.load_iris()
# 每行数据为一个样本
# 每列数据代表不同样本同一属性下对应的数值
print iris.data
# 打印iris数据单位
print iris.feature_names
结果:
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]
…
[6.7 3. 5.2 2.3]
[6.3 2.5 5. 1.9]
[6.5 3. 5.2 2. ]
[6.2 3.4 5.4 2.3]
[5.9 3. 5.1 1.8]]
[‘sepal length (cm)’, ‘sepal width (cm)’, ‘petal length (cm)’, ‘petal width (cm)’]
数据展示
# 输出的结果
print iris.target
# 结果的含义
print iris.target_names
结果:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
[‘setosa’ ‘versicolor’ ‘virginica’]
确认数据维度
# 确认数据类型
print type(iris.data)
print type(iris.target)
# 确认维度
print iris.data.shape
print iris.target.shape
结果:
<type ‘numpy.ndarray’>
<type ‘numpy.ndarray’>
(150, 4)
(150,)
使用scikit-learn进行数据处理的四个关键点:
1.区分开属性数据与结果数据
2.属性数据与结果数据都是量化的
3.运算过程中,属性数据与结果数据的类型都是NumPy数组
4.属性数据与结果数据的维度是对应的
模型训练
分类:根据数据集目标的特征或属性,划分到已有的类别中
常用的分类算法:K近邻(KNN)、逻辑回归、决策树、朴素贝叶斯
K近邻分类模型(KNN):
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近
的K个实例(也就是上面所说的K个邻居),这K个实例的多数属于某个类,就
把该输入实例分类到这个类中,最简单的机器学习算法之一
模型训练:
选用KNN模型
# coding:utf-8
# iris数据加载
from sklearn import datasets
iris = datasets.load_iris()
# X输入数据赋值;y输出数据赋值
X = iris.data
y = iris.target
# 确认样本与输出数据维度
print X.shape
print y.shape
# 模型调用
from sklearn.neighbors import KNeighborsClassifier
# 创建模型实例
knn1 = KNeighborsClassifier(n_neighbors=1)
# 查看knn是什么
print knn1
# 模型训练
knn1.fit(X, y)
结果:
(150, 4)
(150,)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=1, p=2,
weights='uniform')
根据模型预测
# 使用模型预测,要对应训练数据类型
X1 = [[1, 2, 3, 4], [2, 4, 1, 2]]
y1 = knn1.predict(X1)
# 查看预测结果
print y1
# 创建不同模型实例训练
knn5 = KNeighborsClassifier(n_neighbors=5)
# 模型训练
knn5.fit(X, y)
# 使用新的模型预测
y2 = knn5.predict(X1)
# 查看预测结果
print y2
结果:
[2 0]
[1 0]
模型评估
选择合适的模型方法
评估流程:
使用准确率的方式评估:可以方便的用于衡量模型的整体预测效果,但无法反映细节信息,具体表现在:
1.没有体现数据的实际分布情况
2.没有体现模型错误预测的类型
空准确率:当模型总是预测比例较高的类别,其预测准确率的数值
将整个数据集用于训练和测试:
训练数据与测试数据相同导致的问题:
- 训练模型的最终目标是为了预测新数据对应的结果
- 最大化训练准确率通常会导致模型复杂化(比如增加维度),因此将降低模型的通用性
- 过度复杂模型容易导致训练数据的过度拟合
分离训练数据和测试数据:
分离训练集与测试集数据的作用:
- 可以实现在不同的数据集上进行模型训练与预测
- 建立数学模型的目的是对新数据的预测,基于测试数据计算的准确率能更有效的评估模型的表现
模型关键参数(K)选择
目标:
确定合适的参数(组),提高模型预测准确率
方法:
1.遍历参数组合,建立对应的模型
2.使用训练集数据进行模型训练
3.使用测试集数据进行预测,评估每个模型的表现
4.通过图形展示参数(组)与准确率的关系,确定合适的参数(组)
# 用knn5模型预测训练数据,获取准确率
y3 = knn5.predict(X)
# 同时用knn1模型预测训练数据,获取准确率
y4 = knn1.predict(X)
# 准确率
from sklearn.metrics import accuracy_score
print accuracy_score(y, y3)
print accuracy_score(y, y4)
结果:
0.9666666666666667
1.0
训练数据和测试数据分离:
# 数据分离
from sklearn.model_selection import train_test_split
# 40%数据用来测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4)
# 分离后数据集的维度确认
print X_train.shape, X_test.shape, y_train.shape, y_test.shape
结果:
(90, 4) (60, 4) (90,) (60,)
# 分离后数据集的训练与评估
knn5.fit(X_train, y_train)
y_train_pred = knn5.predict(X_train)
y_test_pred = knn5.predict(X_test)
print accuracy_score(y_train, y_train_pred)
print accuracy_score(y_test, y_test_pred)
结果(多次执行结果不同):
0.9666666666666667
0.9166666666666666
如何确定合适的K值:
KNeighborsClassifier(n_neighbors=K值),k值越小,模型越复杂
# k:1-25
# 遍历所有可能的参数组合
# 建立相应的model
# model训练 预测
# 给予测试数据的准确率计算
# 查看最高的准确率对应的k值
k_range = list(range(1, 26))
print k_range
score_train = []
score_test = []
for k in k_range:
knn_temp = KNeighborsClassifier(n_neighbors=k)
knn_temp.fit(X_train, y_train)
y_train_pred = knn_temp.predict(X_train)
y_test_pred = knn_temp.predict(X_test)
score_train.append(accuracy_score(y_train, y_train_pred))
score_test.append(accuracy_score(y_test, y_test_pred))
for k in k_range:
print k, score_train[k - 1]
for k in k_range:
print k, score_test[k - 1]
结果(多次执行结果不同):
1 1.0
2 0.9888888888888889
3 0.9777777777777777
4 0.9777777777777777
5 0.9777777777777777
6 0.9888888888888889
7 0.9777777777777777
8 0.9777777777777777
9 0.9777777777777777
10 0.9777777777777777
11 0.9777777777777777
12 0.9888888888888889
13 0.9777777777777777
14 0.9888888888888889
15 0.9666666666666667
16 0.9777777777777777
17 0.9666666666666667
18 0.9666666666666667
19 0.9666666666666667
20 0.9666666666666667
21 0.9666666666666667
22 0.9666666666666667
23 0.9666666666666667
24 0.9666666666666667
25 0.9666666666666667
1 0.9166666666666666
2 0.9333333333333333
3 0.9333333333333333
4 0.9166666666666666
5 0.9666666666666667
6 0.9333333333333333
7 0.9333333333333333
8 0.9333333333333333
9 0.9166666666666666
10 0.9333333333333333
11 0.9166666666666666
12 0.9333333333333333
13 0.9333333333333333
14 0.9333333333333333
15 0.9333333333333333
16 0.9166666666666666
17 0.9333333333333333
18 0.9
19 0.9333333333333333
20 0.8833333333333333
21 0.8833333333333333
22 0.8833333333333333
23 0.8833333333333333
24 0.8833333333333333
25 0.8833333333333333
利用绘图工具辅助分析:
# 图形展示
# 导入Matplotlib图库并使图像在notebook中展示
import matplotlib.pyplot as plt
# %matplotlib inline
# 展示k值与训练数据集预测准确率之间的关系
plt.plot(k_range, score_train)
plt.xlabel('K(KNN model)')
plt.ylabel('Training Accuracy')
# 展示k值与训练数据集预测准确率之间的关系
plt.plot(k_range, score_test)
plt.xlabel('K(KNN model)')
plt.ylabel('Training Accuracy')
# 解决pycharm不显示图表问题
plt.show()
其他模型:
逻辑回归模型:
用于解决分类问题的一种模型。根据数据特征或属性,计算其归属于某一类别的概率P(x),根据概率数值判断其所属类别,主要应用场景,二分类问题。
模型评估方式说明
混淆矩阵:
混淆矩阵,又称为误差矩阵,用于衡量分类算法的准确程度
.True Positives (TP):预测准确、实际为正样本的数量(实际为1 ,预测为1 )
.True Negatives (TN):预测准确、实际为负样本的数量(实际为0 ,预测为0 )
.False Positives (FP): 预测错误、实际为负样本的数量(实际为0 ,预测为1 )
.False Negatives (FN):预测错误、实际为正样本的数量(实际为1 ,预测为0 )
特点:
分类任务中,相比单一的预测准确率,混淆矩阵提供了更全面的模型评估信息
通过混淆矩阵,我们可以计算出多样的模型表现衡量指标,从而更好的选择模型
指标:
准确率(Accuracy):整体样本中,预测正确的比例
错误率(Misclassification Rate):整体样本中,预测错误的比例
召回率(Recall):正样本中,预测正确的比例
特异度(Specificity):负样本中,预测正确的比例
精确率(Precision):预测结果为正样本中,预测正确的比例
F1分数(F1 Score):综合Precision和Recall的判断指标
哪个衡量指标更关键:
衡量指标的选择取决于应用场景
问题排查:
1.pip install scikit-learn时:
pip._vendor.urllib3.exceptions.ReadTimeoutError
更换镜像或设置超时时间:
更换镜像:
pip install -i http://mirrors.aliyun.com/pypi/simple/
pip install -i http://pypi.douban.com/simple/
设置超时时间(更换镜像无果,选择了设置超时,耗时半天。。。):
pip --default-timeout=100 install scikit-learn
2.pip install matplotlib时:
pip --default-timeout=100 install matplotlib
3.%matplotlib inline一直报错:
https://www.jianshu.com/p/2dda5bb8ce7d
4.报错解决却不能显示
增加plt.show()