加载数据
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import neighbors,datasets
np.random.seed(0)
iris=datasets.load_iris()
X=iris.data[:,0:2]
Y=iris.target
data=np.hstack((X,Y.reshape(Y.size,1)))
np.random.shuffle(data)
X=data[:,:-1]
Y=data[:,-1]
train_x=X[:-30]
test_x=X[-30:]
train_y=Y[:-30]
test_y=Y[-30:]
绘制样本点
def plot_samples(ax,x,y):
n_classes=3
plot_colors='bry'
for i,color in zip(range(n_classes),plot_colors):
idx=np.where(y==i)
ax.scatter(x[idx,0],x[idx,1],c=color,label=iris.target_names[i],cmap=plt.cm.Paired)
分类预测的分布图
def plot_classifier_predict_meshgrid(ax,clf,x_min,x_max,y_min,y_max):
plot_step=0.02
xx,yy=np.meshgrid(np.arange(x_min,x_max,plot_step),
np.arange(y_min,y_max,plot_step))
Z=clf.predict(np.c_[xx.ravel(),yy.ravel()])
Z=Z.reshape(xx.shape)
ax.contourf(xx,yy,Z,camp=plt.cm.Paired)
取最后30个数据作为测试集
def mlpclassifier_iris():
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
classifier=MLPClassifier(activation='logistic',max_iter=10000,hidden_layer_sizes=(30,))
classifier.fit(train_x,train_y)
train_score=classifier.score(train_x,train_y)
test_score=classifier.score(test_x,test_y)
x_min,x_max=train_x[:,0].min()-1,train_x[:,0].max()+2
y_min,y_max=train_x[:,1].min()-1,train_x[:,1].max()+2
plot_classifier_predict_meshgrid(ax,classifier,x_min,x_max,y_min,y_max)
plot_samples(ax,train_x,train_y)
ax.legend(loc='best')
ax.set_xlabel(iris.feature_names[0])
ax.set_ylabel(iris.feature_names[1])
ax.set_title('train score:%f;test score:%f'%(train_score,test_score))
plt.show()
mlpclassifier_iris()
不同的隐含层的影响
def mipclassifier_iris_hidden_layer_sizes():
fig=plt.figure()
hidden_layer_sizes=[(10,),(30,),(100,),(5,5),(10,10),(30,30)]
for itx,size in enumerate(hidden_layer_sizes):
ax=fig.add_subplot(2,3,itx+1)
classifier=MLPClassifier(activation='logistic',max_iter=1000,
hidden_layer_sizes=size)
classifier.fit(train_x,train_y)
train_score=classifier.score(train_x,train_y)
test_score=classifier.score(test_x,test_y)
x_min,x_max=train_x[:,0].min()-1,train_x[:,0].max()+2
y_min,y_max=train_x[:,1].min()-1,train_x[:,1].max()+2
plot_classifier_predict_meshgrid(ax,classifier,x_min,x_max,
y_min,y_max)
plot_samples(ax,train_x,train_y)
ax.legend(loc='best')
ax.set_xlabel(iris.feature_names[0])
ax.set_ylabel(iris.feature_names[1])
ax.set_title('layer_size:%s;train score:%f;test score:%f'%
(size,train_score,test_score))
plt.show()
mipclassifier_iris_hidden_layer_sizes()
激活函数的影响
def mlpclassifier_iris_ativations():
fig=plt.figure()
ativations=['logistic','tanh','relu']
for itx,act in enumerate(ativations):
ax=fig.add_subplot(1,3,itx+1)
classifier=MLPClassifier(activation=act,max_iter=10000,
hidden_layer_sizes=(30,))
classifier.fit(train_x,train_y)
train_score=classifier.score(train_x,train_y)
test_score=classifier.score(test_x,test_y)
x_min,x_max=train_x[:,0].min()-1,train_x[:,0].max()+2
y_min,y_max=train_x[:,1].min()-1,train_x[:,1].max()+2
plot_classifier_predict_meshgrid(ax,classifier,x_min,x_max,
y_min,y_max)
plot_samples(ax,train_x,train_y)
ax.legend(loc='best')
ax.set_xlabel(iris.feature_names[0])
ax.set_ylabel(iris.feature_names[1])
ax.set_title('activation:%s;train score:%f;test score:%f'%
(act,train_score,test_score))
plt.show()
mlpclassifier_iris_ativations()
优化算法的影响
def mlpclassifier_iris_algorithms():
fig=plt.figure()
solvers=['lbfgs','sgd','adam']
for itx,solver in enumerate(solvers):
ax=fig.add_subplot(1,3,itx+1)
classifier=MLPClassifier(activation='tanh',max_iter=10000,
hidden_layer_sizes=(30,),solver=solver)
classifier.fit(train_x,train_y)
train_score=classifier.score(train_x,train_y)
test_score=classifier.score(test_x,test_y)
x_min,x_max=train_x[:,0].min()-1,train_x[:,0].max()+2
y_min,y_max=train_x[:,0].min()-1,train_x[:,0].max()+2
plot_classifier_predict_meshgrid(ax,classifier,x_min,x_max,
y_min,y_max)
plot_samples(ax,train_x,train_y)
ax.legend(loc='best')
ax.set_xlabel(iris.feature_names[0])
ax.set_ylabel(iris.feature_names[1])
ax.set_title('solver:%s;train score:%f;test score:%f'%
(solver,train_score,test_score))
plt.show()
mlpclassifier_iris_algorithms()
η参数的影响
def mlpclassifier_iris_eta():
fig=plt.figure()
etas=[0.1,0.01,0.001,0.0001]
for itx,eta in enumerate(etas):
ax=fig.add_subplot(2,2,itx+1)
classifier=MLPClassifier(activation='tanh',max_iter=1000000,
hidden_layer_sizes=(30,),solver='sgd',learning_rate_init=eta)
classifier.fit(train_x,train_y)
iter_num=classifier.n_iter_
train_score=classifier.score(train_x,train_y)
test_score=classifier.score(test_x,test_y)
x_min,x_max=train_x[:,0].min()-1,train_x[:,0].max()+2
y_min,y_max=train_x[:,1].min()-1,train_x[:,1].max()+2
plot_classifier_predict_meshgrid(ax,classifier,x_min,x_max,
y_min,y_max)
plot_samples(ax,train_x,train_y)
ax.legend(loc='best')
ax.set_xlabel(iris.feature_names[0])
ax.set_ylabel(iris.feature_names[1])
ax.set_title('eta:%f;train score:%f;test score:%f;iter_num:%d'%
(eta,train_score,test_score,iter_num))
plt.show()
mlpclassifier_iris_eta()