使用Sklearn数据挖掘的一般流程
python学习 . 2020/03/10发布 . shanyonggang_web . 我要评论 . 24阅读

加载数据

一是sklearn自带的数据集,二是创建的数据集

sklearn库的输入主要是numpy的arrays,因此会需要到numpy库,也可以使用pandas中的导入数据方法,如:pd.read_csv,最终都需要输入numpy,所以根据实际情况转换就可以,举例:

# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
data = pd.read_csv()

数据预处理

大多数机器学习算法中的梯度方法对于数据的缩放和尺度都是很敏感的,在开始跑算法之前,我们应该进行归一化或者标准化的过程,这使得特征数据缩放到0-1范围中

归一化,将样本在向量空间模型上的一个转换,经常被使用在分类与聚类中。其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,例如:

from sklearn import preprocessing
normalized_X=preprocessing.Normalize(X)

尺度缩放,针对变量,例如:

scaled_X=preprocessing.scale(X)

标准化,将特征数据的分布调整成标准正太分布,也叫高斯分布,也就是使得数据的均值维0,方差为1,例如:

standardized_X=preprocessing.StandardScaler(X)

区间缩放,区间缩放法是将原始数据中特征的取值区间转换到[0 1]范围,例如:

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0,1))
iris_X = scaler.fit_transform(iris_X)

特征二值化,将特征的取值转化为0或1,在sklearn中可以设置一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0,例如:

from sklearn.preprocessing import Binarizer
#二值化,阈值设置为3,返回值为二值化后的数据
Binarizer(threshold=3).fit_transform(iris.data)

one-hot编码,是一种对离散特征值的编码方式,在LR模型中常用到,用于给线性模型增加非线性能力,如:

from sklearn.preprocessing import OneHotEncoder
#对IRIS数据集的目标值进行one-hot编码
OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))

缺失值处理,如:

from numpy import vstack, array, nan
from sklearn.preprocessing import Imputer
#缺失值计算,返回值为计算缺失值后的数据
#参数missing_value为缺失值的表示形式,默认为NaN
#对数据集新增一个样本,4个特征均赋值为NaN,表示数据缺失
#参数strategy为缺失值填充方式,默认为mean(均值)
Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))

数据集划分

在预处理阶段,还需要对数据集进行划分,包括用来训练模型的训练集、以及测试时所使用的测试集。sklearn中的model_selection为我们提供了划分数据集的方法,例如:

import sklearn.model_selection as sk_model_selection
X_train,X_test,y_train,y_test = sk_model_selection.train_test_split(iris_X,iris_y,train_size=1/3,random_state=0)

特征工程

根据实际项目需求确定特征向量

模型训练

以KNN算法为例,

  • 导入模型。调用逻辑回归KNeighborsClassifier()函数
  • fit()训练。调用fit(x,y)的方法来训练模型,其中x为数据的属性,y为所属类型
  • predict()预测。利用训练得到的模型对数据集进行预测,返回预测结果

如下:

#莺尾花分类
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
iris = load_iris()#加载数据
iris_X = iris.data#花的所有数据
iris_Y =iris.target#花的类别
print(iris_X)
print("################")
# print(iris_X[:2,:])
# print("###########")
print(iris_Y)
X_train,X_test,y_train,y_test = train_test_split(iris_X,iris_Y,test_size=0.3)#把数据进行分开,分的是总的数据,test_size是测试数据占百分之三十
# print(y_train)#这个分开的数据是打乱顺序的
knn = KNeighborsClassifier()#K近邻
knn.fit(X_train,y_train)
print(knn.predict(X_test))
print(knn.score(X_test,y_test))#输出得分

算法参数优化

模型评估

.score查看模型的评分准确率,过拟合、欠拟合的模型状态判断是模型诊断中至关重要的一步。常见的方法如:交叉验证,绘制学习曲线等。

  • 过拟合的基本调优思路:增加训练的数据量,降低模型复杂度
  • 欠拟合的基本调优思路:提高特征数量和质量、增加模型复杂度

交叉选择验证法是从数据集中按一定比例随机选取若干数据集作为训练集用于模型的训练,并将剩下的数据作为测试集;将测试集数据的自变量输入模型,并将模型输出的预测值与对应数据的因变量进行比较,判断并统计准确率的方法,其中sklearn提供了cross_val_score进行交叉验证,而ShuffleSplit则用来划分数据集的,如:

X=iris_X
y=iris_y
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import ShuffleSplit
cv_split = ShuffleSplit(n_splits=5, train_size=0.7, test_size=0.2)
score_ndarray = cross_val_score(logisticRegression_model, X, y, cv=cv_split)
print(score_ndarray)
score_ndarray.mean()

模型优化

参考资料:官方文档,整体思路是,将需要搜索最优参数的一系列候选值赋给一个数组,然后用参数搜索接口如GridSearchCV去训练,而不是直接用算法去训练,这些搜索接口接受具体的算法和候选参数作为输入。返回的结果中就包含了最佳得分和最佳参数,如:

#模型目标的参数
from sklearn.model_selection import GridSearchCV
penaltys=['l1','l2']#l1 或l2正则化
cs = [1.0,1.1,1.2,1.3,1.4,1.5]
param_grid = {'penalty':penaltys,'C':cs}
#print(param_grid)
gsc = GridSearchCV(LogisticRegression(),param_grid)
#print(x_train)
gsc.fit(X_train,y_train)

 


  • 有疑问请在下方评论区留言,我会尽快回复。
  • Email私信我: 511248513@qq.com 或添加博主 微信
本文作者:shanyonggang_web
发布时间:2020年3月10日 13:03
许可协议: 署名-非商业性使用 4.0 国际许可协议
知识共享许可协议     转载请保留原文链接及作者
正在加载今日诗词....
您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击下面的


登录 后回复

当前暂无评论,点击登录来做第一个吃螃蟹的人吧!