【Python基础训练营】7. Python之Sklearn

目录

  1. Sklearn简介
  2. 常规使用模式
  3. 数据标准化
  4. 交叉验证
  5. 过拟合问题
  6. 保存模型
  7. 总结

1. sklearn简介

Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression)、
降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)方法。

  • 常用的回归:线性、决策树、SVM、KNN;集成回归:随机森林,Adaboost、GradientBoosting、Bagging、ExtraTrees

  • 常用的分类:线性、决策树、SVM、KNN、朴素贝叶斯;集成分类:随机森林,Adaboost、GradientBoosting、Bagging、ExtraTrees

  • 常用聚类:k均值(K-means)、层次聚类(Hierarchical clustering)、DBSCAN

  • 常用降维:LinearDiscriminantAnalysis、PCA

  • 特点:

    • 简单高效的数据挖掘环境中的数据分析工具;
    • 让每个人能够在复杂重复使用;
    • 建立Numpy、Scipy、Matplotlib之上
  • 安装命令:pip install scikit-learn

2. sklearn常规使用模式

在这里插入图片描述
写入.csv
一般,我们参加比赛会把最后的模型结果写入.csv文件,提交。

#生成一个样本对应ID,假设是1-45的序号
ind=[]
for i in range(45):
    ind.append(i+1)
#回顾Pandas中的数据框
import pandas as pd
dic={'id':ind,'pred':y_pred}#y_pred表示模型预测的结果
test_pred=pd.DataFrame(dic)
test_pred.head()

在这里插入图片描述

#将数据框写入.csv文件中
test_pred.to_csv('knn_iris.csv',index=False)

3. 数据标准化

  • 存在的问题:如果某个特征的方差比其他特征大几个数量级,那么他就会在学习算法中占据主导位置,导致学习期对其他特征有所忽略。
  • 标准化:先对数据进行去中心化,再除以特征的标准差,对数据进行缩放。
  • 实现方式:数据标准化通过sklearn中的preprocessing.scale()方法实现。

是否标准化

from sklearn import preprocessing
import numpy as np
a=np.array([[10,2.7,3.6],[-100,5,-2],[120,20,40]],dtype=np.float64)
print("标准化前的数据",a)
print("标准化前的数据",preprocessing.scale(a))
#结果:
标准化前的数据 [[  10.     2.7    3.6]
 [-100.     5.    -2. ]
 [ 120.    20.    40. ]]
标准化前的数据 [[ 0.         -0.85170713 -0.55138018]
 [-1.22474487 -0.55187146 -0.852133  ]
 [ 1.22474487  1.40357859  1.40351318]]
 
X_pre=X
y_pre=y
X_train_pre,X_test_pre,y_train_pre,y_test_pre=train_test_split(X_pre,y_pre,test_size=0.3)
clf=SVC()
clf.fit(X_train_pre,y_train_pre)
print(clf.score(X_test_pre,y_test_pre))
结果:0.522222222223
#利用minmax方式对数据进行规范化
X=preprocessing.minmax_scale(X)#feature_range=(-1,1)#可设置重置范围
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
clf.fit(X_train,y_train)
print(clf.score(X_test,y_test))
结果:0.9111111111

总结:可以看到数据规范化之前的模型分数为0.5222,数据规范化之后模型分数为0.9111。

4. 交叉验证

交叉验证的思想就是重复的使用数据,把得到的样本数据几星切分,组合成为不同的训练集和验证集,用训练集来训练模型,用验证集评估模型预测的好坏。

  1. 简单的交叉验证
    随机的将样本数据分为两部分(如70%训练,30%测试),然后用训练集来训练模型,在验证集上验证模型及参数;接着再把样本打乱,重新选择训练集和验证集,重新训练验证,最后选择损失函数评估最优的模型和参数。

  2. K折交叉验证
    随机将样本数均分为K份,每次随机选择其中的k-1份作为训练集,剩下的1份做验证集。当这一轮完成后,重新随机选择k-1份来训练数据,重新随机选择k-1份来训练数据,若干轮后选择损失函数评估最优的模型和参数。

  3. 留一交叉验证
    留一交叉验证是k折交叉验证的一种特例,此时k=n(样本的个数),每次选择n-1个样本进行训练,留一个样本进行验证模型的好坏(这种方法适合样本量非常少的情况)。

  4. boostrapping自助采样
    这种方法也是随机森林训练样本采用的方法。在n个样本中随机有放回抽样m个样本作为一棵树的一个训练集,这种采用会大约有1/3的样本不被才到,这些不被采到的样本就会被作为这棵树的杨征集。

#交叉验证
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score#导入交叉验证

#加载数据
iris=load_iris()
X=iris.data
y=iris.data
y=iris.target

#训练数据
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)

knn=KNeighborsClassifier(n_neighbors=5)#选择邻近的5个点
scores=cross_val_score(knn,X,y,cv=5,scoring='accuracy')#5折交叉验证,评分方式为accuracy
print(scores)#每组的评分结果
print(scores.mean())

结果:
[0.9666667 1. 0.933333 0.9666667]
0.9733333334

5. 过拟合

  • 过拟合的问题是因为模型过于复杂,对于训练数据能很好的拟合,却不能正确的处理测试数据,从一个角度说就是,学到了一些样本数据一些非通用信息,使得模型的泛化效果非常不好。
  • learning_curve():主要是用来判断(可视化)模型是否过拟合的。
  • validation_curve():主要是用来查看在参数不同的取值下,模型的性能。

6. 保存模型

  1. 目的
    我们花费很长时间训练数据,调整参数,得到最优模型。但如果改变平台,我们还需要重新训练数据和修正参数,为了节约时间,我们可以先将mode保存起来,就可以很方便的将模型迁移。
  2. 模型的保存和加载
    1、从sklearn中导入自带模型
    from sklearn.externals import joblib
    2、保存模型
    joblib.dump(model,'sklearn_save/clf.pkl)
    3、重新加载模型
    model2=joblib.load('sklearn_save/clf.pkl)

7. 总结

  1. 加载数据集:自己的数据,或者网上的数据,或者sklearn自带的数据。
  2. 数据预处理:降维,数据归一化,特征提取,特征转换。
  3. 选择模型并训练:直接查看api找到你需要的方法,直接调用即可,其中你可能需要调参等。
  4. 模型评分:使用模型自带的score方法,或者使用sklearn指标函数,或者使用自己的评价方法。
  5. 模型的保存。

猜你喜欢

转载自blog.csdn.net/weixin_41990278/article/details/90724667