Sklearn中的深度学习基础算法-神经网络MLP

sklearn是专注于机器学习的库,它在神经网络的模块中特地标注:sklearn不是用于深度学习的平台,因此这个神经网络不具备做深度学习的功能,也不具备处理大型数据的能力,所以神经网络在sklearn中颇有被冷落的意思。原理讲解也非常简单,并没有详细的描述。但是使用神经网络的类还是有很多参数,写法详细。
在这里插入图片描述

以多层感知机为基础的类:MLPClassifier-神经网络分类器

class sklearn.neural_network.MLPClassifier (hidden_layer_sizes=(100, ), activation=’relu’,
solver=’adam’, alpha=0.0001, batch_size=’auto’, learning_rate=’constant’, learning_rate_init=0.001,
power_t=0.5, max_iter=200, shuffle=True, random_state=None, tol=0.0001, verbose=False,
warm_start=False, momentum=0.9, nesterovs_momentum=True, early_stopping=False,
validation_fraction=0.1, beta_1=0.9, beta_2=0.999, epsilon=1e-08, n_iter_no_change=10)

隐藏层与神经元:重要参数hidden_layer_sizes

神经网络算法中要考虑的第一件事情就是我们的隐藏层的结构,如果不设定结构,神经网络本身甚至无法构建,因此这是一个超参数。
参数含义
hidden_layer_sizes
元组,长度= n_layers - 2,默认值(100, )
元祖中包含多少个元素,就表示设定多少隐藏层
元祖中的第i个元素表示第i个隐藏层中的神经元数量
先来建立一个神经网络吧。

  1. 导入需要的数据和库,导入数据集
import numpy as np
from sklearn.neural_network import MLPClassifier as DNN
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score as cv
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.model_selection import train_test_split as TTS
from time import time
import datetime
data = load_breast_cancer()
X = data.data
y = data.target
Xtrain, Xtest, Ytrain, Ytest = TTS(X,y,test_size=0.3,random_state=420)
  1. 建模,使用交叉验证导出分数
times = time()
dnn = DNN(hidden_layer_sizes=(100,),max_iter=500,random_state=420)
print(cv(dnn,X,y,cv=5).mean())
print(time() - times)
0.9296344747979992
2.0932576656341553
#使用决策树进行一个对比
times = time()
clf = DTC(random_state=420)
print(cv(clf,X,y,cv=5).mean())
print(time() - times)
0.9173989996152366
0.046865224838256836
  1. 查看如何使用参数hidden_layer_sizes
dnn = DNN(hidden_layer_sizes=(100,),max_iter=500,random_state=420).fit(Xtrain,Ytrain)
dnn.score(Xtest,Ytest)
0.9239766081871345
#使用重要参数n_layers_
dnn.n_layers_
3
#可见,默认层数是三层,由于必须要有输入和输出层,所以默认其实就只有一层隐藏层
#迭代次数
dnn.n_iter_
274
#如果增加一个隐藏层上的神经元个数,会发生什么呢?
dnn = DNN(hidden_layer_sizes=(200,),random_state=420)
dnn = dnn.fit(Xtrain,Ytrain)
dnn.score(Xtest,Ytest)
0.9181286549707602
#来试试看学习曲线
s = []
for i in range(100,2000,100):
    dnn = DNN(hidden_layer_sizes=(int(i),),max_iter=500,random_state=420).fit(Xtrain,Ytrain)
    s.append(dnn.score(Xtest,Ytest))
print(i,max(s))
plt.figure(figsize=(20,5))
plt.plot(range(100,2000,100),s)
plt.show()
1900 0.9298245614035088

在这里插入图片描述

#那如果增加隐藏层,控制神经元个数,会发生什么呢?
s = []

layers = [(100,),(100,100),(100,100,100),(100,100,100,100),(100,100,100,100,100),(100,100,100,100,100,100)]

for i in layers:
    dnn = DNN(hidden_layer_sizes=(i),max_iter=500,random_state=420).fit(Xtrain,Ytrain)
    s.append(dnn.score(Xtest,Ytest))
print(i,max(s))
plt.figure(figsize=(20,5))
plt.plot(range(3,9),s)
plt.xticks([3,4,5,6,7,8])
plt.xlabel("Total number of layers")
plt.show()
(100, 100, 100, 100, 100, 100) 0.9239766081871345

在这里插入图片描述

#如果同时增加隐藏层和神经元个数,会发生什么呢?
s = []

layers = [(100,),(150,150),(200,200,200),(300,300,300,300)]

for i in layers:
    dnn = DNN(hidden_layer_sizes=(i),max_iter=500,random_state=420).fit(Xtrain,Ytrain)
    s.append(dnn.score(Xtest,Ytest))
print(i,max(s))
plt.figure(figsize=(20,5))
plt.plot(range(3,7),s)
plt.xticks([3,4,5,6])
plt.xlabel("Total number of layers")
plt.show()
(300, 300, 300, 300) 0.9239766081871345

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/gracejpw/article/details/103198598