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中提供的分類算法非常多,分別存在於不同的模塊中。
模塊名稱 |
函數名稱 |
算法名稱 |
|
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的概率。 |
嶺迴歸 |
參與建模的自變量之間具有多重共線性 |
是一種改進最小二乘估計的方法。 |
主成分迴歸 |
參與建模的自變量之間具有多重共線性 |
主成分迴歸是根據主成分分析的思想提出來的,是對最小二乘法的一種改進,它是參數估計的一種有偏估計。可以消除自變量之間的多重共線性。 |
模塊名稱 |
函數名稱 |
算法名稱 |
|
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))
文章未經博主同意,禁止轉載!