第一部分:什么是模型选择
(1)选择不同的模型
比如选knn,决策树等等
(2)选择相同的模型,设置不同的参数
比如说都选择神经网络,但是里面的激活函数可能就不一样。
第二部分:模型选择的原则
(1)模型效果
(2)运算速度
(3)算力要求
(4)可解释性
第三部分:代码实现
我们以knn,决策树,和多项式逻辑回归模型为例,同时使用k均值交叉认证的方法:
(1)导包
#第一部分:导包
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
# 忽略 ConvergenceWarning
import warnings
warnings.filterwarnings("ignore")
(2)定义knn,决策树,和多项式逻辑回归模型函数
#第二部分:定义计算knn,决策树和多项式逻辑回归的score函数
def model_selection(x, y, cv):#xy是样本,cv是k折交叉验证中的k
knn = KNeighborsClassifier(n_neighbors=3)
dt = DecisionTreeClassifier(max_depth=5)
lr = Pipeline([
('poly', PolynomialFeatures(degree=2)),
('log_reg', LogisticRegression())
])
print('knn_score:%f, dt_score:%f, lr_score:%f' % (
np.mean(cross_val_score(knn, x, y, cv=5)),
np.mean(cross_val_score(lr, x, y, cv=5)),
np.mean(cross_val_score(dt, x, y, cv=5))
))
(3)导入数据集
#第三部分:导入数据集
dataset=datasets.load_digits()
(4)输出knn,决策树,和多项式逻辑回归模型效果
#第四部分:调用模型输出结果
x=dataset.data
y=dataset.target
cv=5
model_selection(x,y,cv)
发现这里面的knn和决策树效果比较好。
(5)定义并使用基础神经网络模型
#第五步:简单神经网络模型
from sklearn.neural_network import MLPClassifier
nn = MLPClassifier(
hidden_layer_sizes=(1,),
activation='identity',
learning_rate_init=0.01,
random_state=233
)
print(np.mean(cross_val_score(nn, x, y, cv=5)))
发现效果更不好,因为上面的那个神经网络模型太简单了。
(6)神经网络的模型选择
①隐藏层的数量②激活函数③反向传播的优化算法
#第五步:简单神经网络模型
from sklearn.neural_network import MLPClassifier
nn = MLPClassifier(
hidden_layer_sizes=(100, 50, 100),#第一层有 100 个神经元,第二层有 50 个神经元,第三层有 100 个神经元。
activation='relu',
learning_rate_init=0.01,
random_state=233,
solver='adam'#使用adam优化器
)
print(np.mean(cross_val_score(nn, x, y, cv=5)))
可以看到提升效果巨大!
(7)以上完整pycharm代码
#第一部分:导包
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
# 忽略 ConvergenceWarning
import warnings
warnings.filterwarnings("ignore")
#第二部分:定义计算knn,决策树和多项式逻辑回归的score函数
def model_selection(x, y, cv):#xy是样本,cv是k折交叉验证中的k
knn = KNeighborsClassifier(n_neighbors=3)
dt = DecisionTreeClassifier(max_depth=5)
lr = Pipeline([
('poly', PolynomialFeatures(degree=2)),
('log_reg', LogisticRegression())
])
print('knn_score:%f, dt_score:%f, lr_score:%f' % (
np.mean(cross_val_score(knn, x, y, cv=5)),
np.mean(cross_val_score(lr, x, y, cv=5)),
np.mean(cross_val_score(dt, x, y, cv=5))
))
#第三部分:导入数据集
dataset=datasets.load_digits()
#第四部分:调用模型输出结果
x=dataset.data
y=dataset.target
cv=5
model_selection(x,y,cv)
#第五步:简单神经网络模型
from sklearn.neural_network import MLPClassifier
nn = MLPClassifier(
hidden_layer_sizes=(100, 50, 100),#第一层有 100 个神经元,第二层有 50 个神经元,第三层有 100 个神经元。
activation='relu',
learning_rate_init=0.01,
random_state=233,
solver='adam'#使用adam优化器
)
print(np.mean(cross_val_score(nn, x, y, cv=5)))