python机器学习之使⽤sklearn库进⾏图⽚、⽂本的分类(附带sklearn安装资源
与教程)
python机器学习之使⽤sklearn库进⾏图⽚、⽂本的分类
下载与安装sklearn
sklearn是python的⼀个库,需要pip安装:
pip install sklearn
但是往往不能安装成功,因为sklearn依赖numpy和scipy,⽽⼤部分⼈的numpy都是pip直接安装但不完整版,所以⼀般会安装sicpy的时候会报错。
那么就有⼈想:我去官⽹下载whl⽂件再安装咯。可惜的是,墙内的官⽹下载普遍速度在10kb/s作⽤,往往还没下好就报错了。所以笔者这⾥给读者留下(百度⽹盘再怎么丧⼼病狂也不⾄于10kb/s吧)
拿到安装包以后,把这两个⽂件放到⾃⼰电脑python⽬录的Scripts⽂件⾥⾯,就像这样:
已经安装过numpy的朋友,请先卸载numpy:pip uninstall numpy
然后打开cmd,⼀路cd到这个位置,然后:
pip install numpy-1.16.4+mkl-cp37-cp37m-win_amd64.whl
pip install scipy-1.1.0-cp37-cp37m-win_amd64.whl
具体哪个前⾯哪个后⾯我忘记了,有需要的可以试⼀下。
python入门教程网盘然后就可以pip install sklearn啦。
前期准备:数据集的下载
这篇⽂章介绍的是基于digits相关数据集的处理图像(⼿写字)和⽂本(新闻),所以最好提前下载数据集
下载新闻数据集python 二维数组
from sklearn.datasets import fetch_20newsgroups
# sample_cate 指定需要下载哪⼏个主题类别的新闻数据
sample_cate =['alt.atheism','ligion.christian','aphics','d','rec.sport.baseball']
# 需要从⽹络上下载,受连接外⽹速度限制, 可能要耐⼼等待⼏分钟时间
newsgroups_train = fetch_20newsgroups(subset='train', categories=sample_cate, shuffle=True)
# 以上得到训练集,以下代码得到测试集
newsgroups_test = fetch_20newsgroups(subset='test', categories=sample_cate, shuffle=True)
把训练集放在newsgroups_train,测试集放在newsgroups_test。
⼿写字分类:
使⽤SVM,朴素贝叶斯,KNN, 使⽤Sklearn⾃带digits数据集训练识别⼿写体
该数据集是1797张8*8像素⼤⼩的灰度图,采⽤分类器进⾏⼿写体识别时,都是将每张图像看成64维的特征向量。
# The digits dataset
digits = datasets.load_digits()
print(digits.DESCR)
显⽰数字灰度图(需要import matplotlib.pyplot as plt)
#显⽰数据集中的第⼀个图像
plt.imshow(digits.images[0], ay_r, interpolation='nearest')
这个实验需要三个分类器,knn、svm、朴素贝叶斯,具体的介绍可以google,或者查看⽂末github库⾥⾯的word资源接下来创建分类器:
# 创建svm分类器
svc_clf = svm.SVC(gamma=0.001)
# 创建KNN分类器
knn_clf = KNeighborsClassifier()
# 创建朴素贝叶斯分类器
nb_clf = MultinomialNB()
接下来划分数据集(news⾥⾯就不需要了,因为我们下载数据集的时候以及分好了)
# Split data into train and test subsets
# 使⽤train_test_split将数据集分为训练集,测试集, y_train 表⽰训练集中样本的类别标签, y_test表⽰测试集中样本的类别标签
# test_size = 0.5 表⽰使⽤⼀半数据进⾏测试, 另⼀半就⽤于训练
X_train, X_test, y_train, y_test = train_test_split(
data, digits.target, test_size=0.5, shuffle=False)
使⽤fit进⾏训练:
# 调⽤fit⽅法进⾏训练,传⼊训练集样本和样本的类别标签,进⾏有监督学习
svc_clf.fit(X_train, y_train)
knn_clf.fit(X_train, y_train)
nb_clf.fit(X_train, y_train)
进⾏预测:`
# 调⽤predict,⽤训练得到的模型在测试集进⾏类别预测,得到预测的类别标签
svc_predicted = svc_clf.predict(X_test)
php的运行方式knn_predicted = knn_clf.predict(X_test)
nb_predicted = nb_clf.predict(X_test)`
然后开始输出:
svc_images_and_predictions =list(zip(digits.images[n_samples //2:], svc_predicted))
knn_images_and_predictions =list(zip(digits.images[n_samples //2:], knn_predicted))
nb_images_and_predictions =list(zip(digits.images[n_samples //2:], nb_predicted))
# 在图表的第⼆⾏输出svm在测试集的前四个⼿写体图像上的分类结果,⼤家可以在图上看看结果对不对
集合java
for ax,(image, svc_prediction)in zip(axes[1,:], svc_images_and_predictions[:4]):
ax.set_axis_off()
ax.imshow(image, ay_r, interpolation='nearest')
ax.set_title('Prediction: %i'% svc_prediction)
# 在图表的第三⾏输出KNN在测试集的前四个⼿写体图像上的分类结果,⼤家可以在图上看看结果对不对
# ⼤家应该可以发现KNN把第⼆列的8这个⼿写数字识别为3,发⽣错误
for ax,(image, knn_prediction)in zip(axes[2,:], knn_images_and_predictions[:4]):
ax.set_axis_off()
ax.imshow(image, ay_r, interpolation='nearest')
ax.set_title('Prediction: %i'% knn_prediction)
# 在图表的第四⾏输出朴素贝叶斯在测试集的前四个⼿写体图像上的分类结果,⼤家可以在图上看看结果对不对
for ax,(image, nb_prediction)in zip(axes[3,:], nb_images_and_predictions[:4]):
ax.set_axis_off()
古风文本框素材图片ax.imshow(image, ay_r, interpolation='nearest')
ax.set_title('Prediction: %i'% nb_prediction)
# 绘制出图
plt.show()
输出性能指标:
# 输出三个分类器的性能指标,⼤家需要了解⼆分类、多分类的性能评估指标主要有哪些# 输出svm的分类性能指标
print("Classification report for classifier %s:\n%s\n"
%(svc_clf, metrics.classification_report(y_test, svc_predicted)))
# 输出KNN的分类性能指标
print("Classification report for classifier %s:\n%s\n"
%(knn_clf, metrics.classification_report(y_test, knn_predicted)))
# 输出naive bayes的分类性能指标
print("Classification report for classifier %s:\n%s\n"
%(nb_clf, metrics.classification_report(y_test, nb_predicted)))
⼿写字分类总体代码:
运⾏结果:
新闻⽂本分类
对⽂本的分来较图像更为简单,因为不需要进⾏矩阵处理。
过程和⼿写字处理差不多,fit之后进⾏预测,然后输出性能指标
>negotiation skills

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。