因为实验缘由,准备入坑 python 机器学习,而 python 机器学习经常使用的包就是 scikit-learn ,准备先了解一下这个工具。在这里搜了有 scikit-learn 关键字的书,找到了3本:《Learning scikit-learn: Machine Learning in Python》《Mastering Machine Learning With scikit-learn》《scikit-learn Cookbook》,第一本是2013年出版,后两本是2014年出版,都下下来看了下目录和页数,第一本只有118页,后两本分别为238页和214页,考虑到但愿可以尽快看完一本,对总体 sklearn 有必定了解,最后选择了第一本进行阅读。
这本书上周看完了,可是笔记尚未整理,趁着写这个博客,从新复习一遍,增强理解,巩固记忆,若是有说错的地方,敬请指出。html
一共分为4个大章节:第一章是对机器学习的一个入门介绍;第二章和第三章分别介绍了监督学习和无监督学习在 sklearn 中的几种算法实现,每一个算法用一个例子进行分别介绍,我的以为很不错;第四章是对一些前面提到的高级技巧进行分类阐述,若是说前面的算法实现只是一个基本模型构建,第四章讲的内容,可以让模型进一步优化,达到如虎添翼的效果。
私觉得这本书写得很不错,虽然页数很少,讲的内容也不是特别深刻,可是对于一个机器学习小白来讲,是一本很不错的入门书籍。看完这本书,可以对使用机器学习方法解决问题树立一个比较系统的思路和流程,并且因为页数很少,看完一本书基本也就花了大概一天半的时间,若是英语or有必定机器学习基础可能会更快。
可是这本书也有一个很是严重的缺陷——太老了。里面的代码都是用 python2 写的,并且一些函数接口,最新的 sklearn 快要不支持了,还有一些使用的数据集,连接下载的时候也遇到了一些问题,还有一些 typos 错误。这个读书笔记边整理的时候,也就边在对一些代码使用 python3 进行实现。python
大多数用机器学习解决问题的过程能够简化成3个步骤:linux
Scikit-learn 须要提早安装 Numpy 和 Scipy,参照后文的说法,最好还要安装 Pandas 和 Matplotlib。
windows 下建议直接安装 Anaconda,不错的集成工具,包含 Jupyter Notebook 和 Spyder,以及几乎全部的依赖包,若是没有再安装便可。
linux 下就直接安装 python 的虚拟环境,利用 pip 包管理工具一个一个进行安装,能够看这里,总结了一个很是简要的linux下搭建python机器学习环境的相关命令。
Mac 下也有相似的工具 MacPorts 和 HomeBrew。算法
sklearn 包含一些公开知名的数据集,只要引入相关的数据集包就能够。
这里引入了 1936 年鸢尾花的那个数据集,试一下代码(本文的代码都是基于python2实现的,但这个笔记都把代码转化成了 python 3的实现形式,后文就不一一赘述了)。windows
from sklearn import datasets iris = datasets.load_iris() X_iris, Y_iris = iris.data, iris.target print(X_iris.shape, Y_iris.shape) print(X_iris[0],Y_iris[0])
(150, 4) (150,) [ 5.1 3.5 1.4 0.2] 0
shape表示矩阵的维度,行x列。
Numpy 会把数据按照相似 R 的数据框 or 矩阵的格式读取进来,数据一行表示一个实例,一列表示一个特征,基本后续的算法输入也是这种格式。数据结构
这里举了个线性的例子,利用上面的数据集,用花萼的宽度和长度做为特征。随机选择了75%的做为训练集,剩下的做为测试集,来预测花的类别。dom
#数据集初步处理,构造训练集和验证集 from sklearn.cross_validation import train_test_split from sklearn import preprocessing X, y = X_iris[:,:2], Y_iris X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33) print(X_train.shape, y_train.shape)
(112, 2) (112,)
#对数据进行归一化 scaler = preprocessing.StandardScaler().fit(X_train) X_train = scaler.transform(X_train) X_test = scaler.transform(X_test) print(scaler)
StandardScaler(copy=True, with_mean=True, with_std=True)
#用横坐标为花萼长度,纵坐标为花萼宽度做图,不一样种类的花用不一样颜色表示,对数据结构进行可视化展现,能够指导后续的模型选择和创建 %matplotlib inline #这句话是在 jupyter 中展现图片必须写的命令,不然图片显示不出来 import matplotlib.pyplot as plt colors = ['red','greenyellow','blue'] for i in range(len(colors)): xs = X_train[:,0][y_train == i] ys = X_train[:,1][y_train == i] plt.scatter(xs, ys, c=colors[i]) plt.legend(iris.target_names) plt.xlabel('Sepal length') plt.ylabel('Sepal width')
Text(0,0.5,'Sepal width')
#训练模型 from sklearn.linear_model import SGDClassifier clf = SGDClassifier() clf.fit(X_train, y_train) print(clf.coef_) print(clf.intercept_)
[[-38.1319044 4.82101696] [ 0.74533565 -12.21001281] [ 10.94046262 -9.35131933]] [-11.9120138 -2.94008476 -17.30968766]
#开始做图 x_min, x_max = X_train[:,0].min() - .5, X_train[:,0].max() + .5 y_min, y_max = X_train[:,1].min() - .5, X_train[:,1].max() + .5 import numpy as np xs = np.arange(x_min, x_max, 0.5) fig, axes = plt.subplots(1,3) fig.set_size_inches(10,6) for i in [0, 1, 2]: axes[i].set_aspect('equal') axes[i].set_title('Class' + str(i) + ' versus the rest') axes[i].set_xlabel('Sepal length') axes[i].set_ylabel('Sepal width') axes[i].set_xlim(x_min, x_max) axes[i].set_ylim(y_min, y_max) plt.sca(axes[i]) plt.scatter(X_train[:,0], X_train[:, 1], c=y_train, cmap=plt.cm.prism) ys = (-clf.intercept_[i] - xs * clf.coef_[i, 0]) /clf.coef_[i, 1] plt.plot(xs, ys, hold=True)
给一个实例,进行预测(训练集和测试集都要作一样的数据处理工做,如正则化等):机器学习
#预测 print(clf.predict(scaler.transform([[4.7, 3.1]])))
[0]
print(clf.decision_function(scaler.transform([[4.7, 3.1]])))
[[ 36.57038398 -5.03172599 -31.97218356]]
模型构建完毕,可是还须要评定性能:函数
#在训练集上的性能评估 from sklearn import metrics y_train_pred = clf.predict(X_train) print(metrics.accuracy_score(y_train, y_train_pred))
0.776785714286
#在测试集上的性能评估 y_pred = clf.predict(X_test) print(metrics.accuracy_score(y_test, y_pred))
0.526315789474
算法在训练集上的效果确定比测试集上要好,因此是一个检测算法性能上限的方法。工具
F1值的计算是一个结合精确率和召回率的评估指标,值为 2* presion * recall/(precision + recall)
#总体的分析报告 print(metrics.classification_report(y_test, y_pred, target_names=iris.target_names))
precision recall f1-score support setosa 1.00 1.00 1.00 8 versicolor 0.38 1.00 0.55 11 virginica 1.00 0.05 0.10 19 avg / total 0.82 0.53 0.42 38
#看混淆矩阵,能够看出究竟是哪些判错影响了性能 print(metrics.confusion_matrix(y_test, y_pred))
[[ 8 0 0] [ 0 11 0] [ 0 18 1]]
经常使用的交叉验证方法来评估模型:
#采用5折交叉验证的方法对模型进行评估 from sklearn.cross_validation import cross_val_score, KFold from sklearn.pipeline import Pipeline clf = Pipeline([ ('scaler', preprocessing.StandardScaler()), ('linear_model', SGDClassifier()) ]) cv = KFold(X.shape[0], 5, shuffle=True, random_state=33) scores = cross_val_score(clf, X, y, cv=cv) print(scores)
[ 0.66666667 0.63333333 0.6 0.83333333 0.86666667]
#计算5折的平均分值,即为模型的性能 from scipy.stats import sem def mean_score(scores): return ("Mean score: {0:.3f} (+/-{1:.3f})").format(np.mean(scores), sem(scores)) print(mean_score(scores))
Mean score: 0.720 (+/-0.054)
sepal:花萼;
petal:花瓣;
setosa:刺芒野古草;
versicolor:杂色的;
virginica:维尔吉尼卡;
harmonic:和谐的,和声的;
intuitively:直观的,直觉的;
adequately:充分的,足够的,适当的;
instantiation:实例化;
annotated:有注释的,带注释的。
总体来讲,第一章用一个简单的线性分类器的例子,走了一遍简要的机器学习的流程,介绍了一些相关概念,可以对机器学习有一个简要的认识。
机器学习的一些分类:
机器学习的一些重要概念:
欢迎转载本博客文章,转载请注明出处,十分感谢。