[个人笔记]python机器学习库 sklearn用法笔记

该库可以轻松实现多种最基本的机器学习方法(不包括复杂的深度学习网络),用作baseline非常方便合适。
本文代码仅在这篇博文基础上增加一些模型评估部分

不用交叉验证

步骤如下:

  1. train_test_split分割数据集,X和y的shape[0]是样本数,需要相同。 X的维度≤2
  2. 新建一个分类器对象,fit方法训练模型。
  3. 分类器对象.predict()来获得预测值
  4. 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交叉验证

  1. 准备数据X,y。shape[0]为样本个数。
  2. 创建分类器对象(例子里是knn)
  3. 在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了。
所以我们还是单独划分数据集来做。

步骤如下:

  1. LeaveOneOut 分割数据集,X和y的shape[0]是样本数,需要相同。 X的维度≤2
  2. 新建一个分类器对象,fit方法训练模型。
  3. 分类器对象.predict()来获得预测值
  4. sm.accuracy_score(testlabel, test_predict)sm.confusion_matrix(testlabel, test_predict), sm.classification_report(testlabel, test_predict)这三个方法评估模型。
  5. 把每种分割的结果求平均值,作为最后的结果
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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值