sklearn训练感知器用iris数据集
简化版代码
1 from sklearn import datasets 2 import numpy as np 3 4 #获取data和类标 5 iris = datasets.load_iris() 6 X = iris.data[:,[2,3]] 7 y = iris.target 8 9 #测试样本和训练样本三七分 10 from sklearn.model_selection import train_test_split 11 X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0) 12 13 #数据特征标准化 14 from sklearn.preprocessing import StandardScaler 15 sc = StandardScaler() 16 sc.fit(X_train) 17 X_test_std = sc.transform(X_test) 18 X_train_std = sc.transform(X_train) 19 20 #训练感知器模型 21 from sklearn.linear_model import Perceptron 22 ppn = Perceptron(max_iter=40,eta0=0.1,random_state=0) 23 ppn.fit(X_train_std,y_train) 24 25 #训练完成后,对测试数据进行预测 26 y_pred = ppn.predict(X_test_std) 27 print('Missclassified samples:%d'%(y_pred!=y_test).sum()) 28 from sklearn.metrics import accuracy_score 29 print('Accuracy:%.2f'%accuracy_score(y_test,y_pred))
解释版+可视化
from sklearn import datasets#iris已包含在sklearn库中 import numpy as np iris = datasets.load_iris() #提取150个花朵样本中的花瓣长度和花瓣宽度两个特征的值,并由此构建特征矩阵X,同时将对应花朵所属类型的类标赋值给向量y #打印出来iris可以发现iris包括的key包括五个值:data(其中有四列)、target、target_name、DESCR、feature_names #X提取的是data里面的3、4列,y提取的是target,即类型的类标 #print(iris) #print(iris.keys()) #print(iris.data.shape) #print(iris.data[:5])#显示样本前五行,因为iris是字典不是列表,所以不能调用head()的方法获取前五行 X = iris.data[:, [2, 3]] y = iris.target#iris的每个样本都包含了品种信息,即目标属性(第5列,也叫target或label) '''如果执行np.unique(y)返回存储在iris.target中的各类花朵的类标,可以看到,scikit-learn已分别将Iris-Sentosa、Iris-Versicolor 和Iris-Virginia的类名另存为整数(0,1,2),对许多机器学习库来说,这是针对性能优化一种推荐的做法 print(np.unique(y)) ''' ''' 为了评估训练得到的模型在未知数据上的表现,我们进一步将数据集划分为训练数据集和测试数据集 使用scikit-learn中model_selection模块中的train_test_split函数,随机将数据矩阵X与类标向量y按照3:7的比例划分为测试数据集( 45个样本)和训练数据集(105个样本) ''' from sklearn.model_selection import train_test_split X_train, X_test, y_train,y_test = train_test_split(X, y, test_size=0.3, random_state=0) ''' 许多机器学习和优化算法都要求对数据做特征缩放。我们将使用scikit-learn的preprocessing模块中的StandardScaler类 对特征进行标准化处理 在下面的代码中,从preprocessing模块中加载了StandardScaler类,并实例化了一个StandScaler对象,用变量sc作为对它的引用 使用StandardScaler中的fit方法,可以计算训练数据中的每个特征的μ(样本均值)和σ(标准差)。通过调用transform方法, 可以使用前面计算得到的μ和σ来对训练数据做标准化处理。注意:需要使用相同的缩放参数分别处理训练和测试数据。 ''' from sklearn.preprocessing import StandardScaler sc = StandardScaler() sc.fit(X_train) X_train_std = sc.transform(X_train) X_test_std = sc.transform(X_test) ''' 在对训练数据做了标准化处理后,下面训练感知器模型 ''' from sklearn.linear_model import Perceptron ppn = Perceptron(max_iter=40, eta0=0.1, random_state=0)#n_iter是迭代次数,eta是学习速率,random_state参数在每次迭代后初始化重新排练数据集 ppn.fit(X_train_std, y_train) ''' 使用scikit-learn完成模型的训练后,就可以在测试数据集上使用predict方法进行预测了 ''' y_pred = ppn.predict(X_test_std)#predict class labels for samples in X print('Misclassified samples:%d'%(y_test != y_pred).sum()) ''' 计算感知器在测试数据集上的分类准确率 ''' from sklearn.metrics import accuracy_score print('Accuracy:%.2f' % accuracy_score(y_test,y_pred)) ''' 使用plot_decision_regions函数来绘制刚刚训练过得模型的决策区域,并观察不同花朵样本的分类项 ''' from matplotlib.colors import ListedColormap import matplotlib.pyplot as plt def plot_decision_regions(X,y,classifier,test_idx = None,resolution = 0.02): #setup marker generator and color map markers = ('s', 'x', 'o', '^', 'v') colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan') cmap = ListedColormap(colors[:len(np.unique(y))]) #plot the decision surface x1_min, x1_max = X[:, 0].min()-1, X[:, 0].max()+1 x2_min, x2_max = X[:, 0].min()-1, X[:, 1].max()+1 xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution)) Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) Z = Z.reshape(xx1.shape) plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap) plt.xlim(xx1.min(), xx1.max()) plt.ylim(xx2.min(), xx2.max()) #plot all samples X_test,y_test = X[test_idx, :], y[test_idx] for idx, cl in enumerate(np.unique(y)): plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1], alpha=0.8, c=cmap(idx), marker=markers[idx], label=cl) #highlight test samples if test_idx: X_test, Y_test = X[test_idx, :], y[test_idx] plt.scatter(X_test[:, 0],X_test[:, 1], c='', alpha=1.0, linewidth=1, marker='o', s=55, label='test set') X_combined_std = np.vstack((X_train_std, X_test_std)) Y_combined = np.hstack((y_train, y_test)) plot_decision_regions(X=X_combined_std, y=Y_combined, classifier=ppn, test_idx=range(105, 150)) plt.xlabel('petal length [standardized]') plt.ylabel('petal width [standardized]') plt.legend(loc='upper left') print(plt.show())
自己手动注释