#例12-8 使用训练集和测试集,对iris数据进行分类
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.neural_network import MLPClassifier
import pandas as pd
from sklearn.model_selection import train_test_split
import joblib
iris = datasets.load_iris()
# 为可视化方便,取前2列作为特征属性
#print('iris的内容为:\n',iris)
X = iris.data[:, :2]#不包括上限2
y = iris.target
# 划分训练集,测试集
X_train,X_test, y_train,y_test = train_test_split(
X,y,train_size = 0.8,random_state = 42)
hidden_n,hidden_m=10,6#隐层大小,2层,神经元数量分别为hidden_n,hidden_m
clf = MLPClassifier(solver='lbfgs', alpha=1e-5,
hidden_layer_sizes=(hidden_n,hidden_m), random_state=1)
clf.fit(X_train, y_train)
print('构建神经网络模型的参数为:\n',clf)
#%%
#可视化原始数据、训练集和全平面预测结果
plt.rc('font', size=14)#设置图中字号大小
plt.rcParams['font.sans-serif'] = 'SimHei'#设置字体为SimHei显示中文
plt.rcParams['axes.unicode_minus']=False#坐标轴刻度显示负号
#设置横轴、纵轴的范围
x_min =np.min(X[:,0])-1
x_max = np.max(X[:,0])+1
y_min =np.min(X[:,1])-1
y_max = np.max(X[:,1])+1
p = plt.figure(figsize=(12,8))
# 子图1,绘制原始数据
ax1 = p.add_subplot(2,2,1)
plt.scatter(X[:,0],X[:,1],c=y)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.title('全部样本')#添加标题
# 子图2,绘制训练集
ax1 = p.add_subplot(2,2,2)
plt.scatter(X_train[:,0],X_train[:,1],c=y_train)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.title('训练集样本')#添加标题
#准备要预测的全平面数据
#XX, YY分别从最小值到最大值间均匀取200个数,形状都为200*200
XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
#XX.ravel(), YY.ravel()分别将XX, YY展平为40000*1的数组
#np.c_[XX.ravel(), YY.ravel()]的形状为40000*2
#将XX,YY转换成它们规定的平面内每个点的坐标
Z = np.c_[XX.ravel(), YY.ravel()]
Z_predict=clf.predict(Z)#预测Z
#设置Z_predict的形状与XX相同,准备将其与XX,YY规定的平面内的每一点的颜色值关联
Z_predict = Z_predict.reshape(XX.shape)
ax1 = p.add_subplot(2,2,3)
plt.pcolormesh(XX, YY, Z_predict/2, cmap=plt.cm.Paired)
plt.scatter(X[:,0],X[:,1],c=y)
plt.title('训练集得到的模型分类预测结果')#添加标题
#对XX,YY规定的平面设置坐标轴刻度范围
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xlabel('sepal length')
plt.ylabel('sepal width')
p.tight_layout()#调整整体空白,各子图不重叠
plt.show()
#%%
joblib.dump(clf,'iris_2features_ann.m')#保存模型
clf_nn = joblib.load('iris_2features_ann.m') #加载模型
print('加载的神经网络模型的参数为:\n',clf_nn)
#%%
y_pred = clf_nn.predict(X_test)
for i in [0,1,2,3,4]:
print('测试集第',i,'个样本',X_test[i,0:2],'的分类预测结果为:',y_pred[i])
#%%
#可视化测试集和测试集分类结果
plt.rc('font', size=14)#设置图中字号大小
plt.rcParams['font.sans-serif'] = 'SimHei'#设置字体为SimHei显示中文
plt.rcParams['axes.unicode_minus']=False#坐标轴刻度显示负号
#设置横轴、纵轴的范围
x_min =np.min(X[:,0])-1
x_max = np.max(X[:,0])+1
y_min =np.min(X[:,1])-1
y_max = np.max(X[:,1])+1
#获得测试集类标签同类的索引
y0,y1,y2=np.where(y_test==0),np.where(y_test==1),\
np.where(y_test==2)
#获得测试集预测结果类标签同类的索引
y0_pred,y1_pred,y2_pred=np.where(y_pred==0),\
np.where(y_pred==1),np.where(y_pred==2)
#可视化测试集分类结果,绘制各个类的散点图
p=plt.figure(figsize=(12,4))
ax1 = p.add_subplot(1,2,1)#1行2列2幅子图的第1幅
plt.scatter(X_test[y0,0],X_test[y0,1],marker='o')
plt.scatter(X_test[y1,0],X_test[y1,1],marker='*')
plt.scatter(X_test[y2,0],X_test[y2,1],marker='D')
plt.title('iris测试集及类别')#添加标题
labels=['类0','类1','类2']
plt.legend(labels)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
ax1 = p.add_subplot(1,2,2)#1行2列2幅子图的第2幅
#绘制测试集预测结果各个类的散点图
plt.scatter(X_test[y0_pred,0],X_test[y0_pred,1],marker='o')
plt.scatter(X_test[y1_pred,0],X_test[y1_pred,1],marker='*')
plt.scatter(X_test[y2_pred,0],X_test[y2_pred,1],marker='D')
plt.title('使用属性0和1训练模型对iris测试集预测的类别')#添加标题
plt.legend(labels)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.show()
#%%
#例12-9 使用训练集和测试集,对iris数据集按照全部4个属性训练神经网络模型
#并对测试集进行分类
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.neural_network import MLPClassifier
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.externals import joblib
#from sklearn.metrics import classification_report
#from sklearn.metrics import roc_curve
#from sklearn.metrics import accuracy_score
# import some data to play with
iris = datasets.load_iris()
# 取全部4列作为特征属性
#print('iris的内容为:\n',iris)
X = iris.data
y = iris.target
#划分训练集,测试集
X_train,X_test, y_train,y_test = train_test_split(
X,y,train_size = 0.8,random_state = 42)
hidden_n,hidden_m=5,4#隐层大小,2层,神经元数量分别为hidden_n,hidden_m
clf = MLPClassifier(solver='lbfgs', alpha=1e-5,
hidden_layer_sizes=(hidden_n,hidden_m), random_state=1)
clf.fit(X_train, y_train)
joblib.dump(clf,'iris_4features_ann.m')#保存模型
print('构建的模型为:\n',clf)
#%%
clf_nn = joblib.load('iris_4features_ann.m') #加载模型
y_pred = clf_nn.predict(X_test)
for i in [0,1,2,3,4]:
print('测试集第',i,'个样本',X_test[i,0:2],'的分类预测结果为:',y_pred[i])
#%%
#可视化测试集和测试集分类结果
plt.rc('font', size=14)#设置图中字号大小
plt.rcParams['font.sans-serif'] = 'SimHei'#设置字体为SimHei显示中文
plt.rcParams['axes.unicode_minus']=False#坐标轴刻度显示负号
#设置横轴、纵轴的范围
x_min =np.min(X[:,0])-1
x_max = np.max(X[:,0])+1
y_min =np.min(X[:,1])-1
y_max = np.max(X[:,1])+1
#获得测试集类标签同类的索引
y0,y1,y2=np.where(y_test==0),np.where(y_test==1),\
np.where(y_test==2)
#获得测试集预测结果类标签同类的索引
y0_pred,y1_pred,y2_pred=np.where(y_pred==0),\
np.where(y_pred==1),np.where(y_pred==2)
#可视化测试集分类结果,绘制各个类的散点图
p=plt.figure(figsize=(12,4))
ax1 = p.add_subplot(1,2,1)#1行2列2幅子图的第1幅
plt.scatter(X_test[y0,0],X_test[y0,1],marker='o')#绘制类0
plt.scatter(X_test[y1,0],X_test[y1,1],marker='*')#绘制类1
plt.scatter(X_test[y2,0],X_test[y2,1],marker='D')#绘制类2
#plt.scatter(X_test[y3,0],X_test[y3,1],marker='v')
plt.title('iris测试集类别')#添加标题
labels=['类0','类1','类2']
plt.legend(labels)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
ax1 = p.add_subplot(1,2,2)#1行2列2幅子图的第2幅
#绘制测试集预测结果各个类的散点图
plt.scatter(X_test[y0_pred,0],X_test[y0_pred,1],marker='o')#绘制预测的类0
plt.scatter(X_test[y1_pred,0],X_test[y1_pred,1],marker='*')#绘制预测的类1
plt.scatter(X_test[y2_pred,0],X_test[y2_pred,1],marker='D')#绘制预测的类2
#plt.scatter(X_test[y3_pred,0],X_test[y3_pred,1],marker='v')
plt.title('使用全部4个属性训练模型对iris测试集预测的结果')#添加标题
plt.legend(labels)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.show()