设为首页 收藏本站
查看: 1315|回复: 0

[经验分享] [Python & Machine Learning] 学习笔记之scikit-learn机器学习库

[复制链接]

尚未签到

发表于 2015-11-29 07:31:41 | 显示全部楼层 |阅读模式
1. scikit-learn介绍
    scikit-learn是Python的一个开源机器学习模块,它建立在NumPy,SciPy和matplotlib模块之上。值得一提的是,scikit-learn最先是由David Cournapeau在2007年发起的一个Google Summer of Code项目,从那时起这个项目就已经拥有很多的贡献者了,而且该项目目前为止也是由一个志愿者团队在维护着。
    scikit-learn最大的特点就是,为用户提供各种机器学习算法接口,可以让用户简单、高效地进行数据挖掘和数据分析。

    scikit-learn主页:scikit-learn homepage

2. scikit-learn安装
    scikit-learn的安装方法有很多种,而且也是适用于各种主流操作系统,scikit-learn主页上也分别详细地介绍了在不同操作系统下的三种安装方法,具体安装详情请移步至 installing scikit-learn。
    在这里,首先向大家推荐一款学习Python的强大的开发环境python(x,y)。python(x,y)是一个基于python的科学计算软件包,它包含集成开发环境Eclipse和Python开发插件pydev、数据交互式编辑和可视化工具spyder,而且还内嵌了Python的基础数据库numpy和高级数学库scipy、3D可视化工具集MayaVi、Python界面开发库PyQt、Python与C/C++混合编译器SWIG。除此之外,python(x,y)配备了丰富齐全的帮助文档,非常方便科研人员使用。

    对于像楼主这样,在学校习惯了用Matlab仿真搞科研的学生而言,python(x,y)是学习Python的一个绝佳选择,其中内嵌的spyder提供了类似于Matlab的交互界面,可以很方便地使用。python(x,y)的下载请点击这里:python(x,y)下载。
    由于scikit-learn是基于NumPy、SciPy和matplotlib模块的,所以在安装scikit-learn之前必须要安装这3个模块,这就很麻烦。但是,如果你提前像楼主这样安装了python(x,y),它本身已经包含上述的模块,你只需下载与你匹配的scikit-learn版本,直接点击安装即可。
    scikit-learn各种版本下载:scikit-learn下载。

3. scikit-learn载入数据集
    scikit-learn内包含了常用的机器学习数据集,比如做分类的iris和digit数据集,用于回归的经典数据集Boston house prices。

    scikit-learn载入数据集实例:



from sklearn import datasets
iris = datasets.load_iris()

  scikit-learn载入的数据集是以类似于字典的形式存放的,该对象中包含了所有有关该数据的数据信息(甚至还有参考文献)。其中的数据值统一存放在.data的成员中,比如我们要将iris数据显示出来,只需显示iris的data成员:



print iris.data
  数据都是以n维(n个特征)矩阵形式存放和展现,iris数据中每个实例有4维特征,分别为:sepal length、sepal width、petal length和petal width。显示iris数据:



[[ 5.1  3.5  1.4  0.2]
[ 4.9  3.   1.4  0.2]
    ... ...
[ 5.9  3.   5.1  1.8]]
  如果是对于监督学习,比如分类问题,数据中会包含对应的分类结果,其存在.target成员中:



print iris.target
    对于iris数据而言,就是各个实例的分类结果:



[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]
4. scikit-learn学习和预测
    scikit-learn提供了各种机器学习算法的接口,允许用户可以很方便地使用。每个算法的调用就像一个黑箱,对于用户来说,我们只需要根据自己的需求,设置相应的参数。
    比如,调用最常用的支撑向量分类机(SVC):



from sklearn import svm
clf = svm.SVC(gamma=0.001, C=100.) #不希望使用默认参数,使用用户自己给定的参数
print clf
  分类器的具体信息和参数:



SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0, degree=3,
gamma=0.001, kernel='rbf', max_iter=-1, probability=False,
random_state=None, shrinking=True, tol=0.001, verbose=False)
    分类器的学习和预测可以分别利用 fit(X,Y) 和 predict(T) 来实现。
    例如,将digit数据划分为训练集和测试集,前n-1个实例为训练集,最后一个为测试集(这里只是举例说明fit和predict函数的使用)。然后利用fit和predict分别完成学习和预测,代码如下:



from sklearn import datasets
from sklearn import svm
clf = svm.SVC(gamma=0.001, C=100.)
digits = datasets.load_digits()
clf.fit(digits.data[:-1], digits.target[:-1])
result=clf.predict(digits.data[-1])
print result
    预测结果为:[8]
    我们可以通过程序来查看测试集中的手写体实例到底长什么样来简单验证一下分类效果,代码和结果如下所示:



import matplotlib.pyplot as plot
plot.figure(1, figsize=(3, 3))
plot.imshow(digits.images[-1], cmap=plot.cm.gray_r, interpolation='nearest')
plot.show()
    最后一个手写体实例为:
DSC0000.png
    我们可以看到,这就是一个手写的数字“8”的,实际上正确的分类也是“8”。我们通过这个简单的例子,就是为了简单的学习如何来使用scikit-learn来解决分类问题,实际上这个问题要复杂得多。(PS:学习就是循序渐进,弄懂一个例子,就会弄懂第二个,... ,然后就是第n个,最后就会形成自己的知识和理论,你就可以轻松掌握,来解决各种遇到的复杂问题。)
    再为各位展示一个scikit-learn解决digit分类(手写体识别)的程序(by Gael Varoquaux),相信看过这个程序大家一定会对scikit-learn机器学习库有了一定的了解和认识。



import matplotlib.pyplot as plt
# Import datasets, classifiers and performance metrics
from sklearn import datasets, svm, metrics
# The digits dataset
digits = datasets.load_digits()
# The data that we are interested in is made of 8x8 images of digits, let's
# have a look at the first 3 images, stored in the `images` attribute of the
# dataset.  If we were working from image files, we could load them using
# pylab.imread.  Note that each image must have the same size. For these
# images, we know which digit they represent: it is given in the 'target' of
# the dataset.
images_and_labels = list(zip(digits.images, digits.target))
for index, (image, label) in enumerate(images_and_labels[:4]):
plt.subplot(2, 4, index + 1)
plt.axis('off')
plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
plt.title('Training: %i' % label)
# To apply a classifier on this data, we need to flatten the image, to
# turn the data in a (samples, feature) matrix:
n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1))
# Create a classifier: a support vector classifier
classifier = svm.SVC(gamma=0.001)
# We learn the digits on the first half of the digits
classifier.fit(data[:n_samples / 2], digits.target[:n_samples / 2])
# Now predict the value of the digit on the second half:
expected = digits.target[n_samples / 2:]
predicted = classifier.predict(data[n_samples / 2:])
print("Classification report for classifier %s:\n%s\n"
% (classifier, metrics.classification_report(expected, predicted)))
print("Confusion matrix:\n%s" % metrics.confusion_matrix(expected, predicted))
images_and_predictions = list(zip(digits.images[n_samples / 2:], predicted))
for index, (image, prediction) in enumerate(images_and_predictions[:4]):
plt.subplot(2, 4, index + 5)
plt.axis('off')
plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
plt.title('Prediction: %i' % prediction)
plt.show()
    输出结果:



Classification report for classifier SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3,
gamma=0.001, kernel='rbf', max_iter=-1, probability=False,
random_state=None, shrinking=True, tol=0.001, verbose=False):
precision    recall  f1-score   support
0       1.00      0.99      0.99        88
1       0.99      0.97      0.98        91
2       0.99      0.99      0.99        86
3       0.98      0.87      0.92        91
4       0.99      0.96      0.97        92
5       0.95      0.97      0.96        91
6       0.99      0.99      0.99        91
7       0.96      0.99      0.97        89
8       0.94      1.00      0.97        88
9       0.93      0.98      0.95        92
avg / total       0.97      0.97      0.97       899

Confusion matrix:
[[87  0  0  0  1  0  0  0  0  0]
[ 0 88  1  0  0  0  0  0  1  1]
[ 0  0 85  1  0  0  0  0  0  0]
[ 0  0  0 79  0  3  0  4  5  0]
[ 0  0  0  0 88  0  0  0  0  4]
[ 0  0  0  0  0 88  1  0  0  2]
[ 0  1  0  0  0  0 90  0  0  0]
[ 0  0  0  0  0  1  0 88  0  0]
[ 0  0  0  0  0  0  0  0 88  0]
[ 0  0  0  1  0  1  0  0  0 90]]
DSC0001.png

5. 总结
    1)scikit-learn的介绍和安装;
    2)对scikit-learn有个概括的了解,能够尝试利用scikit-learn来进行数据挖掘和分析。

6. 参考内容
    [1] An introduction to machine learning with scikit-learn
  [2] 机器学习实战
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144740-1-1.html 上篇帖子: [Python] 利用Django进行Web开发系列(二) 下篇帖子: Python网页爬虫(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表