该库可以轻松实现多种最基本的机器学习方法(不包括复杂的深度学习网络),用作baseline非常方便合适。
本文代码仅在这篇博文基础上增加一些模型评估部分
不用交叉验证
步骤如下:
- train_test_split分割数据集,X和y的shape[0]是样本数,需要相同。 X的维度≤2
- 新建一个分类器对象,fit方法训练模型。
- 分类器对象.predict()来获得预测值
sm.accuracy_score(testlabel, test_predict)
,sm.confusion_matrix(testlabel, test_predict)
,sm.classification_report(testlabel, test_predict)
这三个方法评估模型。
from sklearn import datasets#引入数据集,sklearn包含众多数据集
from sklearn.model_selection import train_test_split#将数据分为测试集和训练集
from sklearn.neighbors import KNeighborsClassifier#利用邻近点方式训练数据
import sklearn.metrics as sm
###引入数据###
iris=datasets.load_iris()#引入iris鸢尾花数据,iris数据包含4个特征变量
iris_X=iris.data#特征变量
iris_y=iris.target#目标值
# X和y的数据,shape[0]是样本个数,二者需要一致
print(iris_X.shape) #(150, 4)
print(iris_y.shape) # (150,)
##
X_train,X_test,y_train,y_test=train_test_split(iris_X,iris_y,test_size=0.3)#利用train_test_split进行将训练集和测试集进行分开,test_size占30%
print(y_train)#我们看到训练数据的特征值分为3类
###训练数据###
knn=KNeighborsClassifier()#引入训练方法 # 可以加很多参数
knn.fit(X_train,y_train)#进行填充测试数据进行训练
###预测数据###
y_predict = knn.predict(X_test)#预测特征值
print(y_test)#真实特征值
##
# 评估模型
score = sm.accuracy_score(y_test, y_predict)
print("The accruacy score is %f" % score)
# 获取混淆矩阵
m = sm.confusion_matrix(y_test, y_predict)
print('混淆矩阵为:', m, sep='\n')
# 获取分类报告
r = sm.classification_report(y_test, y_predict)
print('分类报告为:', r, sep='\n')
print('Features')
用k-fold交叉验证
- 准备数据X,y。shape[0]为样本个数。
- 创建分类器对象(例子里是knn)
- 在cross_val_score方法里使用该分类器对象以及X,y。
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score#引入交叉验证
import matplotlib.pyplot as plt
###引入数据###
iris=datasets.load_iris()
X=iris.data
y=iris.target
###设置n_neighbors的值为1到30,通过绘图来看训练分数###
k_range=range(1,31)
k_score=[]
for k in k_range: # 调参 (仅调一个超参数即k)
knn=KNeighborsClassifier(n_neighbors=k)
scores=cross_val_score(knn,X,y,cv=10,scoring='accuracy')#for classfication
k_score.append(scores.mean()) #原文是k_score.append(loss.mean()),应该有误
plt.figure()
plt.plot(k_range,k_score)
plt.xlabel('Value of k for KNN')
plt.ylabel('CrossValidation accuracy')
plt.show()
#K过大会带来过拟合问题,我们可以选择12-18之间的值
用leave one out法(这部分还没更新完,目前的有点问题,回头更新)
相当于k折交叉验证,但k=样本数量n。
这样无法直接算f1,因为f1的predicted_positive 很可能是0,除数为0了。
所以我们还是单独划分数据集来做。
步骤如下:
- LeaveOneOut 分割数据集,X和y的shape[0]是样本数,需要相同。 X的维度≤2
- 新建一个分类器对象,fit方法训练模型。
- 分类器对象.predict()来获得预测值
sm.accuracy_score(testlabel, test_predict)
,sm.confusion_matrix(testlabel, test_predict)
,sm.classification_report(testlabel, test_predict)
这三个方法评估模型。- 把每种分割的结果求平均值,作为最后的结果
from sklearn import datasets#引入数据集,sklearn包含众多数据集
from sklearn.model_selection import train_test_split#将数据分为测试集和训练集
from sklearn.neighbors import KNeighborsClassifier#利用邻近点方式训练数据
import sklearn.metrics as sm
from sklearn.model_selection import LeaveOneOut
###引入数据###
iris=datasets.load_iris()#引入iris鸢尾花数据,iris数据包含4个特征变量
iris_X=iris.data#特征变量
iris_y=iris.target#目标值
# X和y的数据,shape[0]是样本个数,二者需要一致
print(iris_X.shape) #(150, 4)
print(iris_y.shape) # (150,)
loo = LeaveOneOut()
knn=KNeighborsClassifier()#引入训练方法 # 可以加很多参数
accus = []
f1 = []
for train_ind,test_ind in loo.split(X):
X_train = iris_X[train_ind]
X_test = iris_X[test_ind]
y_train = iris_Y[train_ind]
y_test = iris_Y[test_ind]
knn.fit(X_train,y_train)#进行填充测试数据进行训练
###预测数据###
y_predict = knn.predict(X_test)#预测特征值
print(y_test)#真实特征值
##
# 评估模型
score = sm.accuracy_score(y_test, y_predict)
print("The accruacy score is %f" % score)
accus.append(score)
# 获取混淆矩阵
m = sm.confusion_matrix(y_test, y_predict)
print('混淆矩阵为:', m, sep='\n')
# 获取分类报告
r = sm.classification_report(y_test, y_predict)
print('分类报告为:', r, sep='\n')
print('Features')
final_acc = np.mean(np.array(accus))
更多细节
train_test_split
分割测试集和训练集
X_train, X_test, y_train, y_test = train_test_split(
... X, y, test_size=0.33, random_state=42)
参数列表:
X和y的shape[0]是样本数,需要相同。
test_size:小数表示比例,整数表示样本个数
random_state:随机数种子,每次填一样的值就能得到完全一致的结果
shuffle: bool, default=True,Whether or not to shuffle the data before splitting. If shuffle=False then stratify must be None.
stratify:是否分层。如果样本不均衡的话可以填y。