实验四
一 实验名称
近邻法与决策树
二 目的和意义
- 通学习多种分类器的使用方法,学会通过封装的 scikit-learn 中的机器学习算法解决分类问题。
- 通过实践学习利用文档编写机器学习程序,调整参数,优化结果,并解决问题的方法。
三 操作步骤或算法结构
-
阅读机器学习库 scikit-learn 文档中相关函数部分(https://scikit-learn.org/stable/modules/classes.html)。导入 iris.csv 数据,或其他任何分类训练数据。(可以使用
train_test_split
函数将样本处理为训练集和测试集) -
使用 KNN 函数(KNeighborsClassifier)实现K近邻分类器的训练,并测试分类结果。调整近邻数、算法,观察结果变化。
-
使用决策树分类器(DecisionTreeClassifier)训练数据。使用不同的决策树算法,并使用 graphviz 生成决策树图像,观察不同算法的区别。
-
使用随机森林算法(RandomForestClassifier)训练分类器,并测试分类器的准确度。
四 结构程序设计
-
导入实验数据
from sklearn.datasets import load_iris iris = load_iris()
-
使用KNN的分类实现
import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier iris = datasets.load_iris() sc = StandardScaler() sc.fit(iris.data) sdata = sc.transform(iris.data) traindata, testdata, trainlabel, testlabel=train_test_split(iris.data, iris.target,test_size=0.5,random_state=0,stratify=iris.target) knn = KNeighborsClassifier(n_neighbors=3) knn.fit(traindata,trainlabel) predict = knn.predict(testdata) print('分类准确率:',knn.score(testdata,testlabel))
-
使用决策树的分类实现
from sklearn import tree res = tree.DecisionTreeClassifier() res = res.fit(iris.data, iris.target) # 将模型存入dot文件iris.dot。 with open("iris.dot", 'w') as f: f = tree.export_graphviz(res, out_file=f)
用 graphviz 的dot命令生成决策树的可视化文件,在命令行中运行
dot -Tpdf iris.dot -o iris.pdf
-
使用随机森林算法进行分类
import numpy as np from matplotlib.colors import ListedColormap from sklearn.ensemble import RandomForestClassifier from sklearn.ensemble import ExtraTreesClassifier RF = RandomForestClassifier(n_estimators=100, n_jobs=4, oob_score=True) iris = load_iris() x = iris.data[:, :2] y = iris.target RF.fit(x, y) h = .02 cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF']) cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF']) for weight in ['uniform', 'distance']: x_min, x_max = x[:, 0].min() - 1, x[:, 0].max() + 1 y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1 xx, yy = np.meshgrid( np.arange(x_min, x_max, h), np.arange(y_min, y_max, h) ) z = RF.predict(np.c_[xx.ravel(), yy.ravel()]) z = z.reshape(xx.shape) plt.figure() plt.pcolormesh(xx, yy, z, cmap=cmap_light) plt.scatter(x[:, 0], x[:, 1], c=y, cmap=cmap_bold, edgecolors='k', s=20) plt.xlim(xx.min(), xx.max()) plt.title('RandomForestClassifier') plt.show() print('RandomForestClassifier:', RF.score(x, y))
五 实验结果分析
决策树结果
在理解层面可以将决策树类比数据结构课程中的二叉查找树,以最多 ⌈ log 2 n ⌉ \lceil\log_2n\rceil ⌈log2n⌉ 次 t r u e / f a l s e true /false true/false 判断得到结果
随机森林结果
分类准确率达到 92.7 % 92.7\% 92.7%,随机森林模型在多样本分类中有者广泛的应用。