初识sklearn

sklearn库中包含着常用的机器学习算法,今天就作简单盘点。

导入数据样本

1
2
3
4
5
6
7
8
from sklearn import datasets

wine = datasets.load_wine()
X = wine.data
y = wine.target
# print(X, y)
import numpy as np
print (np.shape(X), np.shape(y))

(178, 13) (178,)

将数据分成训练数据和测试数据

1
2
3
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2,random_state=42)
print(np.shape(X_train), np.shape(X_test))

(142, 13) (36, 13)

训练模型1:逻辑回归模型

1
2
3
4
5
print("利用逻辑回归模型训练")
from sklearn.linear_model import LogisticRegression
model = LogisticRegression().fit(X_train, y_train)
print("训练数据上的准确率为:%f" % (model.score(X_train, y_train)))
print("测试数据上的准确率为:%f" % (model.score(X_test, y_test)))

利用逻辑回归模型训练
训练数据上的准确率为:0.978873
测试数据上的准确率为:1.000000

这里给LR模型喂数据,训练好的模型为model,接下来把训练集X_train和测试集X_test喂入训练好的模型中,并打分。

模型训练是存在偏差的,毕竟LR模型较为简单,因此训练的准确率会出现抖动情况。

训练模型2:支持向量机模型

1
2
3
4
5
6
print("利用svm模型训练")
from sklearn.svm import SVC
model = SVC().fit(X_train, y_train) #此处使用了默认的训练参数

print("训练数据上的准确率为:%f" % (model.score(X_train, y_train)))
print("测试数据上的准确率为:%f" % (model.score(X_test, y_test)))

利用svm模型训练
训练数据上的准确率为:1.000000
测试数据上的准确率为:0.388889

这里的模型在训练数据上的准确率不错,而测试集上表现糟糕。这就是 过拟合现象

为此,才需要交叉验证:设定指定参数来避免过拟合。

训练模型3:决策树模型

1
2
3
4
5
6
print("利用决策树模型训练")
from sklearn import tree
model = tree.DecisionTreeClassifier().fit(X_train, y_train)

print("训练数据上的准确率为:%f" % (model.score(X_train, y_train)))
print("测试数据上的准确率为:%f" % (model.score(X_test, y_test)))

利用决策树模型训练
训练数据上的准确率为:1.000000
测试数据上的准确率为:0.916667

训练模型4:神经网络

1
2
3
4
5
6
7
print("利用神经网络模型训练")
from sklearn.neural_network import MLPClassifier
model = MLPClassifier(alpha=1e-5, hidden_layer_sizes=(200),solver='lbfgs',random_state=3 )
model.fit(X_train, y_train)

print("训练数据上的准确率为:%f" % (model.score(X_train, y_train)))
print("测试数据上的准确率为:%f" % (model.score(X_test, y_test)))

利用神经网络模型训练
训练数据上的准确率为:0.401408
测试数据上的准确率为:0.388889

MLPClassifier模型函数中,我看到实际调参就是在理解原理的基础上,设定不同的参数,如这里指定了隐含层的个数、解算器方法、随机初始值。

在若干次运行后,可以看到该模型很不稳定,效果也没那么好,想必需要接下来好好调教。

最后,有人说“越复杂的模型,参数敏感度越高”,待我验证归来吧。