[转载] Python机器学习库scikit-learn使用小结(二)

参考链接: Scikit-learn中的模型构建:Python机器学习库

scikit-learn库(后三小结) 

       在做数据分析和挖掘的过程中,数据的处理(标准化)、划分、快速建模都是必不可少的方式。这里本人总结了一些scikit-learn(以下简称sklearn)库的使用方法小结,当然也本人在工作中时常需要用到的一些。(方法在精不在多,这里不是sklearn所以的总结) 

       sklearn库整合了多种机器学习算法,能够在数据分析过程中快速建立模型,且模型接口统一,使用起来非常方便。基于官方文档,本次我们只小结4个点:sklearn转换器、数据标准化与数据划分、聚类,分类,回归模型的构建与评估。 

2、聚类,分类,回归模型的构建与评估 

1.1、构建聚类模型 

        聚类分析是在没有给定划分类别的情况下,根据数据相似度进行样本分组的一种方法。聚类模型可以将无类标记的数据,聚集为多个簇,视为一类,是一种非监督的学习算法。在商业上,聚类可以帮助市场分析人员从消费者数据库中区分出不同的消费群体,并且概括出每一类消费者的消费模式或消费习惯。同时,聚类分析也可以作为数据分析算法中其他分析算法的一个预处理步骤,如异常值识别,连续型特征离散化等。 

       聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或相似度将他们划分为若干组,划分的原则是组内样本最小化而组间(外部)距离最大化。sklearn常用的聚类算法模块cluster提供的聚类算法及其适用范围如下表所示。 

 算法类别  包括的主要算法  划分(分裂)方法  K-Means算法(K-平均),K-MEDOIDS算法(K-中心点)和CLARANS算法(基于选择的算法)。  层次分析方法  BIRCH算法(平衡迭代规约和聚类),CURE算法(代表点聚类)和CHAMELEON算法(动态模型)。  基于密度的方法  DBSCAN算法(基于高密度连接区域),DENCLUE算法(密度分布函数)和OPTICS算法(对象排序识别)。  基于网格的方法  STING算法(统计信息网络),CLIOUE算法(聚类高维空间)和WAVE-CLUSTER算法(小波变换)。 

 函数名称  参数  适用范围  距离度量  KMeans  簇数  可用于样本数目很大,聚类数目中等的场景。  点之间的距离  Spectral clustering  簇数  可用于样本数目中等,聚类数目较小的场景。  图距离  Ward hierarchical clustering  簇数  可用于样本数目较大,聚类数目较大的场景。  点之间的距离  Agglomerative clustering  簇数,链接类型,距离  可用于样本数目较大,聚类数目较大的场景。  任意成对点线图间的距离  DBSCAN  半径大小,最低成员数目  可用于样本数目很大,聚类数目中等的场景。  最近的点之间的距离  Birch  分支因子,阈值,可选全局集群  可用于样本数目很大,聚类数目较大的场景。  点之间的欧式距离 

       聚类算法实现需要sklearn估计器(estimator)。sklearn估计器和转换器类似,拥有fit和predict两个方法。 

 方法名称  说明  fit  fit方法主要用于训练算法。该方法可接收用于有监督学习的训练集及其标签两个参数,也可以接收用于无监督学习的数据。  predict  predict用于预测有监督学习的测试集标签,亦可以用于划分传入数据的类别。 

       以iris数据为例,使用sklearn估计器构建KMeans聚类模型。 

from sklearn.datasets import load_iris

from sklearn.preprocessing import MinMaxScaler

from sklearn.cluster import KMeans

iris = load_iris()

iris_data = iris['data'] ##提取数据集中的特征

iris_target = iris['target'] ## 提取数据集中的标签

iris_names = iris['feature_names'] ### 提取特征名

scale = MinMaxScaler().fit(iris_data)## 训练规则

iris_dataScale = scale.transform(iris_data) ## 应用规则

kmeans = KMeans(n_clusters = 3,random_state=123).fit(iris_dataScale) ##构建并训练模型

print('构建的KMeans模型为:\n',kmeans)

 

result = kmeans.predict([[1.5,1.5,1.5,1.5]])

print('花瓣花萼长度宽度全为1.5的鸢尾花预测类别为:', result[0]) 

       聚类完成后需要通过可视化的方式查看聚类效果,通过sklearn的manifold模块中的TSNE函数可以实现多维数据的可视化展现。 

import pandas as pd

from sklearn.manifold import TSNE

import matplotlib.pyplot as plt

##使用TSNE进行数据降维,降成两维

tsne = TSNE(n_components=2,init='random',random_state=177).fit(iris_data)

df=pd.DataFrame(tsne.embedding_) ##将原始数据转换为DataFrame

df['labels'] = kmeans.labels_ ##将聚类结果存储进df数据表

##提取不同标签的数据

df1 = df[df['labels']==0]

df2 = df[df['labels']==1] 

df3 = df[df['labels']==2] 

## 绘制图形

fig = plt.figure(figsize=(9,6)) ##设定空白画布,并制定大小

##用不同的颜色表示不同数据

plt.plot(df1[0],df1[1],'bo',df2[0],df2[1],'r*',df3[0],df3[1],'gD')

plt.savefig('../tmp/聚类结果.png') 

plt.show() ##显示图片 

1.2、评价聚类模型 

       聚类评价的标准是组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不相关的)。即组内的相似性越大,组间差别越大,聚类效果就越好。sklearn的metrics模块提供的聚类模型评价指标,如下表所示。 

 方法名称  真实值  最佳值  sklearn函数  ARI评价法(兰德系数)  需要  1.0  adjusted_rand_score  AMI评价法(互信息)  需要  1.0  adjusted_mutual_info_score  V-measure评分  需要  1.0  completeness_score  FMI评价法  需要  1.0  fowlkes_mallows_score  轮廓系数评价法  不需要  畸变程度最大  silhouette_score  Calinski-Harabasz指数评价法  不需要  相较最大  calinski_harabaz_score 

       其中前4种方法均需要真实值的配合才能够评价聚类算法的优劣,后2种则不需要真实值的配合。但是前4种方法评价的效果更具有说服力,并且在实际运行的过程中在有真实值做参考的情况下,聚类方法的评价可以等同于分类算法的评价。除了轮廓系数以外的评价方法,在不考虑业务场景的情况下都是得分越高,其效果越好,最高分值均为1。而轮廓系数则需要判断不同类别数目的情况下其轮廓系数的走势,寻找最优的聚类数目。 

from sklearn.metrics import fowlkes_mallows_score

for i in range(2,7):

    kmeans = KMeans(n_clusters = i,random_state=123).fit(iris_data) ##构建并训练模型

    score = fowlkes_mallows_score(iris_target,kmeans.labels_)

    print('iris数据聚%d类FMI评价分值为:%f' %(i,score))

 

from sklearn.metrics import silhouette_score

import matplotlib.pyplot as plt

silhouettteScore = []

for i in range(2,15):

    kmeans = KMeans(n_clusters = i,random_state=123).fit(iris_data) ##构建并训练模型

    score = silhouette_score(iris_data,kmeans.labels_)

    silhouettteScore.append(score)

plt.figure(figsize=(10,6))

plt.plot(range(2,15),silhouettteScore,linewidth=1.5, linestyle="-")

plt.show()

 

from sklearn.metrics import calinski_harabaz_score

for i in range(2,7):

    kmeans = KMeans(n_clusters = i,random_state=123).fit(iris_data) ##构建并训练模型

    score = calinski_harabaz_score(iris_data,kmeans.labels_)

    print('iris数据聚%d类calinski_harabaz指数为:%f'%(i,score)) 

       使用FMI评价法评价KMeans聚类;使用轮廓系数评估KMeans模型,然后做出轮廓系数走势图,根据图形判断聚类效果;使用Calinski-Harabasz指数评估KMeans模型,基本判定方法和前4种需要真实值作为依据的方法相同,分值越高,聚类效果越好。 

       综合以上聚类评价方法,在具备真实值作为参考的情况下,几种方法均可以很好地评估聚类模型。在没有真实值作为参考的时候,轮廓系数评价方法和Calinski-Harabasz指数评价方法可以结合使用。 

2.1、构建分类模型 

       在数据分析领域,分类算法有很多,其原理千差万别,有基于样本距离的最近邻算法,有基于特征信息熵的决策树,有基于bagging的随机森林,有基于boosting的梯度提升分类树,但其实现的过程相差不大。sklearn中提供的分类算法非常多,分别存在于不同的模块中。 

 模块名称  函数名称  算法名称  linear_model  LogisticRegression  逻辑斯蒂回归  svm  SVC  支持向量机  neighbors  KNeighborsClassifier  K最近邻分类  naive_bayes  GaussianNB  高斯朴素贝叶斯  tree  DecisionTreeClassifier  分类决策树  ensemble  RandomForestClassifier  随机森林分类  ensemble  GradientBoostingClassifier  梯度提升分类树 

       以breast_cancer数据为例,使用sklearn估计器构建支持向量机(SVM)模型。 

## 加载所需的函数,

import numpy as np

from sklearn.datasets import load_breast_cancer

from sklearn.svm import SVC

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

cancer = load_breast_cancer()

cancer_data = cancer['data']

cancer_target = cancer['target']

cancer_names = cancer['feature_names']

## 将数据划分为训练集测试集

cancer_data_train,cancer_data_test,cancer_target_train,cancer_target_test = \

train_test_split(cancer_data,cancer_target,test_size = 0.2,random_state = 22)

## 数据标准化

stdScaler = StandardScaler().fit(cancer_data_train)

cancer_trainStd = stdScaler.transform(cancer_data_train)

cancer_testStd = stdScaler.transform(cancer_data_test)

## 建立SVM模型

svm = SVC().fit(cancer_trainStd,cancer_target_train)

print('建立的SVM模型为:\n',svm)

 

## 预测训练集结果

cancer_target_pred = svm.predict(cancer_testStd)

print('预测前20个结果为:\n',cancer_target_pred[:20]) 

2.2、评价分类模型 

       分类模型对测试集进行预测而得出的准确率并不能很好地反映模型的性能,为了有效判断一个预测模型的性能表现,需要结合真实值,计算出精确率,召回率,F1值,Cohen’s Kappa系数等指标来衡量。 

 方法名称  最佳值  sklearn函数  Precision(精确率)  1.0  metrics.precision_score  Recall(召回率)  1.0  metrics.recall_score  F1值  1.0  metrics.f1_score  Cohen’s Kappa系数  1.0  metrics.cohen_kappa_score  ROC曲线  最靠近y轴  metrics. roc_curve 

       分类模型评价方法前4种都是分值越高越好,其使用方法基本相同。sklearn的metrics模块除了提供了Precision等单一评价指标的函数外,还提供了一个能够输出分类模型评价报告的函数classfication_report。除了使用数值,表格形式评估分类模型的性能,还可通过绘制ROC曲线的方式来评估分类模型。 

from sklearn.metrics import accuracy_score,precision_score, \

                       recall_score,f1_score,cohen_kappa_score

print('使用SVM预测breast_cancer数据的准确率为:',

      accuracy_score(cancer_target_test,cancer_target_pred))

print('使用SVM预测breast_cancer数据的精确率为:',

      precision_score(cancer_target_test,cancer_target_pred))

print('使用SVM预测breast_cancer数据的召回率为:',

      recall_score(cancer_target_test,cancer_target_pred))

print('使用SVM预测breast_cancer数据的F1值为:',

      recall_score(cancer_target_test,cancer_target_pred))

print('使用SVM预测breast_cancer数据的Cohen’s Kappa系数为:',

      recall_score(cancer_target_test,cancer_target_pred))

 

from sklearn.metrics import classification_report

print('使用SVM预测iris数据的分类报告为:','\n',

      classification_report(cancer_target_test,cancer_target_pred))

 

from sklearn.metrics import roc_curve

import matplotlib.pyplot as plt

## 求出ROC曲线的x轴和Y轴

fpr, tpr, thresholds = roc_curve(cancer_target_test,cancer_target_pred)

plt.figure(figsize=(10,6))

plt.xlim(0,1) ##设定x轴的范围

plt.ylim(0.0,1.1) ## 设定y轴的范围

plt.xlabel('False Postive Rate')

plt.ylabel('True Postive Rate')

plt.plot(fpr,tpr,linewidth=2, linestyle="-",color='red')

plt.show() 

       ROC曲线横纵坐标范围为[0,1],通常情况下ROC曲线与X轴形成的面积越大,表示模型性能越好。 

3.1、构建回归模型 

       回归算法的实现过程与分类算法类似,原理相差不大。分类和回归的主要区别在于,分类算法的标签是离散的,但是回归算法的标签是连续的。回归算法在交通,物流,社交网络,金融领域都能发挥巨大作用。 

       在回归模型中,自变量与因变量具有相关关系,自变量的值是已知的,因变量是要预测的。回归算法的实现步骤和分类算法基本相同,分为学习和预测2个步骤。学习是通过训练样本数据来拟合回归方程;预测则是利用学习过程中拟合出的回归方程,将测试数据放入方程中求出预测值。常用的回归模型如下表所示。 

 回归模型名称  适用条件  算法描述  线性回归  因变量与自变量是线性关系  对一个或多个自变量和因变量之间的线性关系进行建模,可用最小二乘法求解模型系数。  非线性回归  因变量与自变量之间不都是线性关系  对一个或多个自变量和因变量之间的非线性关系进行建模。如果非线性关系可以通过简单的函数变换转化成线性关系,用线性回归的思想求解;如果不能转化,用非线性最小二乘方法求解。  Logistic回归  因变量一般有1和0(是与否)两种取值  是广义线性回归模型的特例,利用Logistic函数将因变量的取值范围控制在0和1之间,表示取值为1的概率。  岭回归  参与建模的自变量之间具有多重共线性  是一种改进最小二乘估计的方法。  主成分回归  参与建模的自变量之间具有多重共线性  主成分回归是根据主成分分析的思想提出来的,是对最小二乘法的一种改进,它是参数估计的一种有偏估计。可以消除自变量之间的多重共线性。 

 模块名称  函数名称  算法名称  linear_model  LinearRegression  线性回归  svm  SVR  支持向量回归  neighbors  KNeighborsRegressor  最近邻回归  tree  DecisionTreeRegressor  回归决策树  ensemble  RandomForestRegressor  随机森林回归  ensemble  GradientBoostingRegressor  梯度提升回归树 

       以boston数据为例,使用sklearn估计器构建LinearRegression模型。 

##加载所需函数

from sklearn.linear_model import LinearRegression

from sklearn.datasets import load_boston

from sklearn.model_selection import train_test_split

## 加载boston数据

boston = load_boston()

X = boston['data']

y = boston['target']

names = boston['feature_names']

## 将数据划分为训练集测试集

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2)

## 建立线性回归模型

clf = LinearRegression().fit(X_train,y_train)

print('建立的LinearRegression模型为:','\n',clf)

 

## 预测训练集结果

y_pred = clf.predict(X_test)

print('预测前20个结果为:','\n',y_pred[:20]) 

       利用预测结果和真实结果画出出折线图,能较为直观看出线性回归模型效果。 

import matplotlib.pyplot as plt

from matplotlib import rcParams

rcParams['font.sans-serif'] = 'SimHei'

fig = plt.figure(figsize=(10,6)) ##设定空白画布,并制定大小

##用不同的颜色表示不同数据

plt.plot(range(y_test.shape[0]),y_test,color="blue", linewidth=1.5, linestyle="-")

plt.plot(range(y_test.shape[0]),y_pred,color="red", linewidth=1.5, linestyle="-.")

plt.legend(['真实值','预测值'])

plt.savefig('聚类结果.png') 

plt.show() ##显示图片 

 

3.2、评价回归模型 

       回归模型的性能评估不同于分类模型,虽然都是对照真实值进行评估,但由于回归模型的预测结果和真实值都是连续的,所以不能够求取Precision,Recall,F1值等评价指标。回归模型拥有一套独立的评价指标。常用的回归模型评价指标如下。 

 方法名称  最优值  sklearn函数  平均绝对误差  0.0  metrics. mean_absolute_error  均方误差  0.0  metrics. mean_squared_error  中值绝对误差  0.0  metrics. median_absolute_error  可解释方差值  1.0  metrics. explained_variance_score  R方值  1.0  metrics. r2_score 

       平均绝对误差,均方误差和中值绝对误差的值越靠近0,模型性能越好。可解释方差值和R方值则越靠近1,模型性能越好。 

from sklearn.metrics import explained_variance_score,mean_absolute_error,\

                       mean_squared_error,median_absolute_error,r2_score

print('Boston数据线性回归模型的平均绝对误差为:',

     mean_absolute_error(y_test,y_pred))

print('Boston数据线性回归模型的均方误差为:',

     mean_squared_error(y_test,y_pred))

print('Boston数据线性回归模型的中值绝对误差为:',

     median_absolute_error(y_test,y_pred))

print('Boston数据线性回归模型的可解释方差值为:',

     explained_variance_score(y_test,y_pred))

print('Boston数据线性回归模型的R方值为:',

     r2_score(y_test,y_pred)) 

  

文章未经博主同意,禁止转载!

你可能感兴趣的:([转载] Python机器学习库scikit-learn使用小结(二))