参看《python数据分析与应用》

1.scikit-learn简称sklean整合了多种机器学习算法,使用方便。

2.sklearn提供的模块:

  model_selection  模型选择

  preprocessing  数据预处理

  decompisition  特征分解

3.sklearn库的datasets模块集成了部分数据分析的经典数据集,常用数据集的加载函数和解释如下:

https://blog.csdn.net/weixin_41571493/article/details/82709345

 

 

数据集名称

调用方式

适用算法

数据规模

小数据集

波士顿房价数据集

load_boston()

回归

506*13

鸢尾花数据集

load_iris()

分类

150*4

糖尿病数据集

load_diabetes()

回归

442*10

乳腺癌数据集

load-breast-cancer()

分类、聚类

 569*30

 

 

 

 

 

大数据集

手写数字数据集

load_digits()

分类

5620*64

Olivetti脸部图像数据集

fetch_olivetti_facecs

降维

400*64*64

新闻分类数据集

fetch_20newsgroups()

分类

 

带标签的人脸数据集

fetch_lfw_people()

分类;降维

 

路透社新闻语料数据集

fetch_rcv1()

分类

804414*47236

加载后的数据集可以视为一个字典,几乎所有的sklearn数据集均可以使用data、target、feature_names、DESCR分别获取数据集的数据、标签、特征名称和描述信息。

# 代码 6-1
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()##将数据集赋值给iris变量
print('breast_cancer数据集的长度为:',len(cancer))
print('breast_cancer数据集的类型为:',type(cancer))


# 代码 6-2
cancer_data = cancer['data']
print('breast_cancer数据集的数据为:','\n',cancer_data)

cancer_target = cancer['target'] ## 取出数据集的标签
print('breast_cancer数据集的标签为:\n',cancer_target)

cancer_names = cancer['feature_names'] ## 取出数据集的特征名
print('breast_cancer数据集的特征名为:\n',cancer_names)

cancer_desc = cancer['DESCR'] ## 取出数据集的描述信息
print('breast_cancer数据集的描述信息为:\n',cancer_desc)

在数据分析过程中,为了保证模型在实际系统中能够起到预期作用,一般需要将样本分成独立的3部分,训练集train_set、验证集和测试集test set。sklearn的model_selection模块提供了train_test_split函数对数据集进行拆分。

# 代码 6-3
print('原始数据集数据的形状为:',cancer_data.shape)
print('原始数据集标签的形状为:',cancer_target.shape)

from sklearn.model_selection import train_test_split
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=42)  #测试集占20%
print('训练集数据的形状为:',cancer_data_train.shape)
print('训练集标签的形状为:',cancer_target_train.shape)
print('测试集数据的形状为:',cancer_data_test.shape)
print('测试集标签的形状为:',cancer_target_test.shape)

https://www.jianshu.com/p/516f009c0875    Scikit-learn使用总结,不错的总结

4.使用sklearn转换器进行数据预处理与降维

转换器主要包含3种方法:

  • fit():训练算法,设置内部参数。
  • transform():数据转换。将规则应用于训练集或者测试集
  • fit_transform():合并fit和transform两个方法

sklearn预处理函数及其作用:(主要在sklearn.preprcessing包下)。

规范化:

  • MinMaxScaler :最大最小值规范化
  • Normalizer :使每条数据各特征值的和为1
  • StandardScaler :为使各特征的均值为0,方差为1

编码:

  • LabelEncoder :把字符串类型的数据转化为整型
  • OneHotEncoder :特征用一个二进制数字来表示
  • Binarizer :为将数值型特征的二值化
  • MultiLabelBinarizer:多标签二值化
  • FunctionTransformer:对特征进行自定义函数变换

minMaxScaler使用实例:

import numpy as np
from sklearn.preprocessing import MinMaxScaler
Scaler = MinMaxScaler().fit(cancer_data_train) ##生成规则
##将规则应用于训练集
cancer_trainScaler = Scaler.transform(cancer_data_train) 
##将规则应用于测试集
cancer_testScaler = Scaler.transform(cancer_data_test)
print('离差标准化前训练集数据的最小值为:',np.min(cancer_data_train))
print('离差标准化后训练集数据的最小值为:',np.min(cancer_trainScaler))
print('离差标准化前训练集数据的最大值为:',np.max(cancer_data_train))
print('离差标准化后训练集数据的最大值为:',np.max(cancer_trainScaler))
print('离差标准化前测试集数据的最小值为:',np.min(cancer_data_test))
print('离差标准化后测试集数据的最小值为:',np.min(cancer_testScaler))
print('离差标准化前测试集数据的最大值为:',np.max(cancer_data_test))
print('离差标准化后测试集数据的最大值为:',np.max(cancer_testScaler))

'''
结果如下:
离差标准化前训练集数据的最小值为: 0.0
离差标准化后训练集数据的最小值为: 0.0
离差标准化前训练集数据的最大值为: 4254.0
离差标准化后训练集数据的最大值为: 1.0000000000000002
离差标准化前测试集数据的最小值为: 0.0
离差标准化后测试集数据的最小值为: -0.057127602776294695
离差标准化前测试集数据的最大值为: 3432.0
离差标准化后测试集数据的最大值为: 1.3264399566986453
'''

5.sklearn除了提供基本的特征变换函数外,还提供了降维算法(如PCA)、特征选择算法,这些算法的使用也是通过转换器的方式进行的。

from sklearn.decomposition import PCA
pca_model = PCA(n_components=10).fit(cancer_trainScaler) ##生成规则
cancer_trainPca = pca_model.transform(cancer_trainScaler) ##将规则应用于训练集
cancer_testPca = pca_model.transform(cancer_testScaler) ##将规则应用于测试集
print('PCA降维前训练集数据的形状为:',cancer_trainScaler.shape)
print('PCA降维后训练集数据的形状为:',cancer_trainPca.shape)
print('PCA降维前测试集数据的形状为:',cancer_testScaler.shape)
print('PCA降维后测试集数据的形状为:',cancer_testPca.shape)

'''
PCA降维前训练集数据的形状为: (455, 30)
PCA降维后训练集数据的形状为: (455, 10)
PCA降维前测试集数据的形状为: (114, 30)
PCA降维后测试集数据的形状为: (114, 10)
'''

6.聚类分析

聚类分析是在没有给定划分类别的情况下,根据数据相似度进行样本分组的一种方法。划分的原则是组内(内部)距离最小化,而组间(外部)距离最大化。聚类算法实现需要sklearn估计器。sklearn估计器(可以直接理解成分类器)主要包含fit和predict两个方法。

  • fit():训练算法,设置内部参数。接收训练集和类别两个参数。(可接收用于有监督学习的训练集及其标签两个参数,也可以接收用于无监督学习的数据)
  • predict():预测测试集类别,参数为测试集。(用于预测有监督学习的测试集标签,也可以用于划分传入数据的类别)

{大多数scikit-learn估计器接收和输出的数据格式均为numpy数组或类似格式。}

例子:使用sklearn估计器构建K-Means聚类模型

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('构建的K-Means模型为:\n',kmeans)

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


# 代码 6-11
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() ##显示图片

'''
构建的K-Means模型为:
 KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
    n_clusters=3, n_init=10, n_jobs=1, precompute_distances='auto',
    random_state=123, tol=0.0001, verbose=0)
花瓣花萼长度宽度全为1.5的鸢尾花预测类别为: 0
'''

scikit-learn库

7.评价聚类模型

下例为使用FMI评价法评价K-Means聚类模型

# 代码 6-12
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))



# 代码 6-13
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()

'''
iris数据聚2类FMI评价分值为:0.750473
iris数据聚3类FMI评价分值为:0.820808
iris数据聚4类FMI评价分值为:0.753970
iris数据聚5类FMI评价分值为:0.725483
iris数据聚6类FMI评价分值为:0.600691
'''

scikit-learn库

8.构建并评价分类模型

 sklearn库的常用分类算法:

逻辑斯蒂回归、支持向量机、k最近邻分类、高斯朴素贝叶斯、分类决策树、随机森林分类、梯度提升分类树。详见:

https://www.jianshu.com/p/0f4524c247e9

下例:使用sklearn估计器构建SVM模型

# -*- coding: utf-8 -*-

###############################################################################
#######################            正文代码             #######################
###############################################################################

# 代码 6-17
## 加载所需的函数,
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])


# 代码 6-18
## 求出预测和真实一样的数目
true = np.sum(cancer_target_pred == cancer_target_test )
print('预测对的结果数目为:', true)
print('预测错的的结果数目为:', cancer_target_test.shape[0]-true)
print('预测结果准确率为:', true/cancer_target_test.shape[0])



# 代码 6-19
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值为:',
      f1_score(cancer_target_test,cancer_target_pred))
print('使用SVM预测breast_cancer数据的Cohen’s Kappa系数为:',
      cohen_kappa_score(cancer_target_test,cancer_target_pred))



# 代码 6-20
from sklearn.metrics import classification_report
print('使用SVM预测iris数据的分类报告为:','\n',
      classification_report(cancer_target_test,
            cancer_target_pred))



# 代码 6-21
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()




###############################################################################
#######################           任务实现             #######################
###############################################################################

# 代码 6-22
import pandas as pd
from sklearn.svm import SVC
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
abalone = pd.read_csv('../data/abalone.data',sep=',')
## 将数据和标签拆开
abalone_data = abalone.iloc[:,:8]
abalone_target = abalone.iloc[:,8]
## 连续型特征离散化
sex = pd.get_dummies(abalone_data['sex'])
abalone_data = pd.concat([abalone_data,sex],axis = 1 )
abalone_data.drop('sex',axis = 1,inplace = True)
## 划分训练集,测试集
abalone_train,abalone_test, \
abalone_target_train,abalone_target_test = \
train_test_split(abalone_data,abalone_target,
      train_size = 0.8,random_state = 42) 
## 标准化
stdScaler = StandardScaler().fit(abalone_train)
abalone_std_train = stdScaler.transform(abalone_train)
abalone_std_test = stdScaler.transform(abalone_test)
## 建模
svm_abalone = SVC().fit(abalone_std_train,abalone_target_train)
print('建立的SVM模型为:','\n',svm_abalone)



# 代码 6-23
abalone_target_pred = svm_abalone.predict(abalone_std_test)
print('abalone数据集的SVM分类报告为:\n',
      classification_report(abalone_target_test,abalone_target_pred))

 

 

 

相关文章: