<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
sklearn提供了model_selection模型選擇模組、preprocessing資料預處理模組、decompisition特徵分解模組,通過這三個模組能夠實現資料的預處理和模型構建前的資料標準化、二值化、資料集的分割、交叉驗證和PCA降維處理等工作。
sklearn庫的datasets模組整合了部分資料分析的經典資料集,可以選用進行資料預處理、建模的操作。
常見的資料集載入函數(器):
資料集載入函數(器) | 資料集任務型別 |
load_digits | 分類 |
load_wine | 分類 |
load_iris | 分類、聚類 |
load_breast_cancer | 分類、聚類 |
load_boston | 迴歸 |
fetch_california_housing | 迴歸 |
載入後的資料集可以看成是一個字典,幾乎所有的sklearn資料集均可以使用data、target、feature_names、DESCR分別獲取資料集的資料、標籤、特徵名稱、描述資訊。
以load_breast_cancer為例:
from sklearn.datasets import load_breast_cancer cancer = load_breast_cancer()##將資料集賦值給iris變數 print('breast_cancer資料集的長度為:',len(cancer)) print('breast_cancer資料集的型別為:',type(cancer)) #breast_cancer資料集的長度為: 6 #breast_cancer資料集的型別為: <class 'sklearn.utils.Bunch'> cancer_data = cancer['data'] print('breast_cancer資料集的資料為:','n',cancer_data) #breast_cancer資料集的資料為: [[1.799e+01 1.038e+01 1.228e+02 ... 2.654e-01 4.601e-01 1.189e-01] [2.057e+01 1.777e+01 1.329e+02 ... 1.860e-01 2.750e-01 8.902e-02] [1.969e+01 2.125e+01 1.300e+02 ... 2.430e-01 3.613e-01 8.758e-02] ... [1.660e+01 2.808e+01 1.083e+02 ... 1.418e-01 2.218e-01 7.820e-02] [2.060e+01 2.933e+01 1.401e+02 ... 2.650e-01 4.087e-01 1.240e-01] [7.760e+00 2.454e+01 4.792e+01 ... 0.000e+00 2.871e-01 7.039e-02]] cancer_target = cancer['target'] ## 取出資料集的標籤 print('breast_cancer資料集的標籤為:n',cancer_target) #breast_cancer資料集的標籤為: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1] cancer_names = cancer['feature_names'] ## 取出資料集的特徵名 print('breast_cancer資料集的特徵名為:n',cancer_names) #breast_cancer資料集的特徵名為: ['mean radius' 'mean texture' 'mean perimeter' 'mean area' 'mean smoothness' 'mean compactness' 'mean concavity' 'mean concave points' 'mean symmetry' 'mean fractal dimension' 'radius error' 'texture error' 'perimeter error' 'area error' 'smoothness error' 'compactness error' 'concavity error' 'concave points error' 'symmetry error' 'fractal dimension error' 'worst radius' 'worst texture' 'worst perimeter' 'worst area' 'worst smoothness' 'worst compactness' 'worst concavity' 'worst concave points' 'worst symmetry' 'worst fractal dimension'] cancer_desc = cancer['DESCR'] ## 取出資料集的描述資訊 print('breast_cancer資料集的描述資訊為:n',cancer_desc) #breast_cancer資料集的描述資訊為: .. _breast_cancer_dataset: Breast cancer wisconsin (diagnostic) dataset -------------------------------------------- **Data Set Characteristics:** :Number of Instances: 569 :Number of Attributes: 30 numeric, predictive attributes and the class :Attribute Information: - radius (mean of distances from center to points on the perimeter) - texture (standard deviation of gray-scale values) - perimeter - area - smoothness (local variation in radius lengths) - compactness (perimeter^2 / area - 1.0) - concavity (severity of concave portions of the contour) - concave points (number of concave portions of the contour) - symmetry - fractal dimension ("coastline approximation" - 1) The mean, standard error, and "worst" or largest (mean of the three largest values) of these features were computed for each image, resulting in 30 features. For instance, field 3 is Mean Radius, field 13 is Radius SE, field 23 is Worst Radius. - class: - WDBC-Malignant - WDBC-Benign :Summary Statistics: ===================================== ====== ====== Min Max ===================================== ====== ====== radius (mean): 6.981 28.11 texture (mean): 9.71 39.28 perimeter (mean): 43.79 188.5 area (mean): 143.5 2501.0 smoothness (mean): 0.053 0.163 compactness (mean): 0.019 0.345 concavity (mean): 0.0 0.427 concave points (mean): 0.0 0.201 symmetry (mean): 0.106 0.304 fractal dimension (mean): 0.05 0.097 radius (standard error): 0.112 2.873 texture (standard error): 0.36 4.885 perimeter (standard error): 0.757 21.98 area (standard error): 6.802 542.2 smoothness (standard error): 0.002 0.031 compactness (standard error): 0.002 0.135 concavity (standard error): 0.0 0.396 concave points (standard error): 0.0 0.053 symmetry (standard error): 0.008 0.079 fractal dimension (standard error): 0.001 0.03 radius (worst): 7.93 36.04 texture (worst): 12.02 49.54 perimeter (worst): 50.41 251.2 area (worst): 185.2 4254.0 smoothness (worst): 0.071 0.223 compactness (worst): 0.027 1.058 concavity (worst): 0.0 1.252 concave points (worst): 0.0 0.291 symmetry (worst): 0.156 0.664 fractal dimension (worst): 0.055 0.208 ===================================== ====== ====== :Missing Attribute Values: None :Class Distribution: 212 - Malignant, 357 - Benign :Creator: Dr. William H. Wolberg, W. Nick Street, Olvi L. Mangasarian :Donor: Nick Street :Date: November, 1995 This is a copy of UCI ML Breast Cancer Wisconsin (Diagnostic) datasets. https://goo.gl/U2Uwz2 Features are computed from a digitized image of a fine needle aspirate (FNA) of a breast mass. They describe characteristics of the cell nuclei present in the image. Separating plane described above was obtained using Multisurface Method-Tree (MSM-T) [K. P. Bennett, "Decision Tree Construction Via Linear Programming." Proceedings of the 4th Midwest Artificial Intelligence and Cognitive Science Society, pp. 97-101, 1992], a classification method which uses linear programming to construct a decision tree. Relevant features were selected using an exhaustive search in the space of 1-4 features and 1-3 separating planes. The actual linear program used to obtain the separating plane in the 3-dimensional space is that described in: [K. P. Bennett and O. L. Mangasarian: "Robust Linear Programming Discrimination of Two Linearly Inseparable Sets", Optimization Methods and Software 1, 1992, 23-34]. This database is also available through the UW CS ftp server: ftp ftp.cs.wisc.edu cd math-prog/cpo-dataset/machine-learn/WDBC/ .. topic:: References - W.N. Street, W.H. Wolberg and O.L. Mangasarian. Nuclear feature extraction for breast tumor diagnosis. IS&T/SPIE 1993 International Symposium on Electronic Imaging: Science and Technology, volume 1905, pages 861-870, San Jose, CA, 1993. - O.L. Mangasarian, W.N. Street and W.H. Wolberg. Breast cancer diagnosis and prognosis via linear programming. Operations Research, 43(4), pages 570-577, July-August 1995. - W.H. Wolberg, W.N. Street, and O.L. Mangasarian. Machine learning techniques to diagnose breast cancer from fine-needle aspirates. Cancer Letters 77 (1994) 163-171.
在資料分析的過程中,為了保證模型在實際系統中能夠起到預期的作用,一般需要將樣本分成獨立的三部分:訓練集(train set)、驗證集(validation set)、測試集(test set)。
訓練集—50%:用於估計模型
驗證集—25%:用於確定網路結構或控制模型複雜程度的引數
測試集—25%:用於檢驗最優模型的效能
當資料總量較少的時候,使用上述方法劃分就不合適。常用的方法是留少部分做測試集,然後對其餘N個樣本採用K折交叉驗證法:
將樣本打亂,並均勻分成K份,輪流選擇其中K-1份做訓練,剩餘一份做檢驗,計算預測誤差平方和,最後把K次的預測誤差平方和的均值作為選擇最優模型結構的依據。
sklearn.model_selection.train_test_split(*arrays,**options)
引數名稱 | 說明 |
*arrays | 接受一個或者多個資料集。代表需要劃分的資料集。若為分類、迴歸,則傳入資料、標籤;若為聚類,則傳入資料 |
test_size | 代表測試集的大小。若傳入為float型別資料,需要限定在0-1之間,代表測試集在總數中的佔比;若傳入的為int型資料,則表示測試集記錄的絕對數目。該引數與train_size可以只傳入一個。 |
train_size | 與test_size相同 |
random_state | 接受int。代表隨機種子編號,相同隨機種子編號產生相同的隨機結果。 |
shuffle | 接受boolean。代表是否進行有回放抽樣,若為True,則stratify引數必須不能為空。 |
stratify | 接受array或None。若不為None,則使用傳入的標籤進行分層抽樣。 |
print('原始資料集資料的形狀為:',cancer_data.shape) print('原始資料集標籤的形狀為:',cancer_target.shape) 原始資料集資料的形狀為: (569, 30) 原始資料集標籤的形狀為: (569,) 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) print('訓練集資料的形狀為:',cancer_data_train.shape) print('訓練集資料的標籤形狀為:',cancer_target_train.shape) print('測試集資料的形狀為:',cancer_data_test.shape) print('測試集資料的標籤形狀為:',cancer_target_test.shape) 訓練集資料的形狀為: (455, 30) 訓練集資料的標籤形狀為: (455,) 測試集資料的形狀為: (114, 30) 測試集資料的標籤形狀為: (114,)
該函數分別將傳入的資料劃分為訓練集和測試集。如果傳入的是一組資料,那麼生成的就是這一組資料隨機劃分後的訓練集和測試集,總共兩組;如果傳入的是兩組資料,那麼生成的訓練集和測試集分別兩組,總共四組。train_test_split方法僅是最常用的資料劃分方法,在model_selection模組中還有其他的劃分函數,例如PredefinedSplit、ShuffleSplit等。
sklearn將相關的功能封裝為轉換器,轉換器主要包含有3個方法:fit、transform、fit_trainsform:
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('離差標準化前訓練集資料的最小值:',cancer_data_train.min()) 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
目前利用sklearn能夠實現對傳入的numpy陣列進行標準化處理、歸一化處理、、二值化處理和PCA降維處理。前面基於pandas庫介紹的標準化處理在日常資料分析過程中,各類特徵處理相關的操作都需要對訓練集和測試集分開進行,需要將訓練集中的操作規則、權重係數等應用到測試集中,利用pandas會使得過程繁瑣,而sklearn轉換器可以輕鬆實現。
除了上面展示的離差標準化函數MinMaxScaler外,還提供了一系列的資料預處理常式:
PCA降維處理:
sklearn.decomposition.PCA(n_components=None, *, copy=True, whiten=False, svd_solver='auto', tol=0.0, iterated_power='auto', random_state=None)
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)
聚類分析是在沒有給定劃分類別的情況下,根據資料相似度進行樣本分組的一種方法。
聚類的輸入是一組未被標記的樣本,聚類根據資料自身的距離或相似度將它們劃分為若干組,劃分的原則是:組內距離最小化,組間距離最大化。
sklearn常用的聚類演演算法模組cluster提供的聚類演演算法:
聚類演演算法的實現需要sklearn估計器(Estimnator),其擁有fit和predict兩個方法:
方法名稱 | 說明 |
fit | fit方法主要適用於訓練演演算法。該方法可以有效接收用於有監督學習的訓練集及其標籤兩個引數,也可以接收用於無監督學習的資料 |
predict | 用於預測有監督學習的測試集標籤,也可以用於劃分傳入資料的類別 |
以iris資料為例,使用sklearn估計器構建K-Means聚類模型:
from sklearn.datasets import load_iris from sklearn.preprocessing import MinMaxScaler from sklearn.cluster import KMeans iris = load_iris() # 載入iris資料集 iris_data = iris['data'] # 提取iris資料集中的特徵 iris_target = iris['target'] # 提取iris資料集中的標籤 iris_feature_names = iris['feature_names'] #提取iris資料集中的特徵名稱 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) #構建的K-Means模型為: KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300, n_clusters=3, n_init=10, n_jobs=None, precompute_distances='auto', random_state=123, tol=0.0001, verbose=0)
聚類完成後可以通過sklearn的manifold模組中的TXNE函數實現多維資料的視覺化展現。
import pandas as pd from sklearn.manifold import TSNE import matplotlib.pyplot as plt # 使用TSNE進行資料降維,降成2維 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.除了輪廓係數評價法以外的評價方法,在不考慮業務場景的情況下都是分數越高越好,最高分為1,而輪廓係數評價法需要判斷不同類別數目情況下的輪廓係數的走勢,尋找最優的聚類數目。
FMI評價法
from sklearn.datasets import load_irisiris = load_iris() # 載入iris資料集iris_data = iris['data'] # 提取資料集特徵 iris_target = iris['target'] # 提取資料集標籤 from sklearn.metrics import fowlkes_mallows_score from sklearn.cluster import KMeans 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)) iris資料聚2類FMI評價分值為:0.750473 iris資料聚3類FMI評價分值為:0.820808 iris資料聚4類FMI評價分值為:0.756593 iris資料聚5類FMI評價分值為:0.725483 iris資料聚6類FMI評價分值為:0.614345
通過結果可以看出來,當聚類為3時FMI評價分最高,所以當聚類3的時候,K-Means模型最好。
輪廓係數評價法
from sklearn.datasets import load_irisiris = load_iris() # 載入iris資料集iris_data = iris['data'] # 提取資料集特徵 iris_target = iris['target'] # 提取資料集標籤 from sklearn.metrics import silhouette_score from sklearn.cluster import KMeans 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()
從圖形可以看出,聚類數目為2、3和5、6時平均畸變程度最大。由於iris資料本身就是3種鳶尾花的花瓣、花萼長度和寬度的資料,側面說明了聚類數目為3的時候效果最佳。
Calinski_Harabasz指數評價法
from sklearn.datasets import load_irisiris = load_iris() # 載入iris資料集iris_data = iris['data'] # 提取資料集特徵 iris_target = iris['target'] # 提取資料集標籤 from sklearn.metrics import silhouette_score from sklearn.cluster import KMeans from sklearn.metrics import calinski_harabasz_score for i in range(2,7): ##構建並訓練模型 kmeans = KMeans(n_clusters = i,random_state=123).fit(iris_data) score = calinski_harabasz_score(iris_data,kmeans.labels_) print('iris資料聚%d類calinski_harabaz指數為:%f'%(i,score)) iris資料聚2類calinski_harabaz指數為:513.924546 iris資料聚3類calinski_harabaz指數為:561.627757 iris資料聚4類calinski_harabaz指數為:530.765808 iris資料聚5類calinski_harabaz指數為:495.541488 iris資料聚6類calinski_harabaz指數為:469.836633
同樣可以看出在聚類為3時,K-Means模型為最優。綜合以上評價方法的使用,在有真實值參考時,幾種方法都能有效的展示評估聚合模型;在沒有真實值參考時,可以將輪廓係數評價與Calinski_Harabasz指數評價相結合使用。
分類是指構造一個分類模型,輸入樣本的特徵值,輸出對應類別,將每個樣本對映到預先定義好的類別。分類模型是建立在自己已有類標記的資料集上,屬於有監督學習。在實際應用場景中,分類演演算法被應用在行為分析、物品識別、影象檢測等。
以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) #建立的SVM模型為: SVC(C=1.0, break_ties=False, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape='ovr', degree=3, gamma='scale', kernel='rbf', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False) ## 預測訓練集結果 cancer_target_pred = svm.predict(cancer_testStd) print('預測前20個結果為:n',cancer_target_pred[:20]) #預測前20個結果為: [1 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1]
## 求出預測和真實一樣的數目 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]) 預測對的結果數目為: 111 預測錯的的結果數目為: 3 預測結果準確率為: 0.9736842105263158
分類模型對測試集進行預測而得出的準確率並不能很好地反映模型的效能,為了有效判斷一個預測模型的效能表現,需要結合真實值計算出精確率、召回率、F1值、Cohen’s Kappa係數等指標來衡量。
使用單一評價指標(Precision、Recall、F1值、Cohen’s Kappa係數)
from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,cohen_kappa_scoreprint('使用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)) 使用SVM預測breast_cancer資料的準確率為: 0.9736842105263158 使用SVM預測breast_cancer資料的精確率為: 0.9594594594594594 使用SVM預測breast_cancer資料的召回率為: 1.0 使用SVM預測breast_cancer資料的F1值為:0.9793103448275862 使用SVM預測breast_cancer資料的Cohen’s Kappa係數為: 0.9432082364662903
sklearn模組除了提供了Precision等單一評價指標外,還提供了一個能夠輸出分類模型評價報告的函數classification_report:
python sklearn.metrics.classification_report(y_true, y_pred, *, labels=None, target_names=None, sample_weight=None, digits=2, output_dict=False, zero_division='warn')
print('使用SVM預測iris資料的分類報告為:n', classification_report(cancer_target_test,cancer_target_pred))#使用SVM預測iris資料的分類報告為: precision recall f1-score support 0 1.00 0.93 0.96 43 1 0.96 1.00 0.98 71 accuracy 0.97 114 macro avg 0.98 0.97 0.97 114 weighted avg 0.97 0.97 0.97 114
繪製ROC曲線
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('FalsePostive Rate') plt.ylabel('True Postive Rate') x = [0,0.2,0.4,0.6,0.8,1] y = [0,0.2,0.4,0.6,0.8,1] # 繪圖 plt.plot(x,y,linestyle='-.',color='green') plt.plot(fpr,tpr,linewidth=2, linestyle="-",color='red') # 展示 plt.show()
ROC曲線橫縱座標範圍是[0,1],通常情況下,ROC曲線與x軸形成的面積越大,表示模型效能越好。當ROC曲線如虛線所示時,表明模型的計算結果基本都是隨機得來的,此時模型起到的作用幾乎為0.
迴歸演演算法的實現過程與分類演演算法相似,原理相差不大。分類和迴歸的主要區別在於,分類演演算法的標籤是離散的,但是迴歸演演算法的標籤是連續的。迴歸演演算法在交通、物流、社交、網路等領域發揮作用巨大。
在迴歸模型中,自變數和因變數具有相關關係,自變數的值是已知的,因變數的值是要預測的。迴歸演演算法的實現步驟和分類演演算法基本相同,分為學習和預測兩個步驟。
學習:通過訓練樣本來擬合迴歸方程
預測:利用學習過程中擬合出的方程,將測試資料放入方程中求出預測值。
from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression # 載入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,random_state=125) # 建立線性迴歸模型 clf = LinearRegression().fit(x_train,y_train) print('建立的Linear Regression模型為:n',clf) #建立的 Linear Regression模型為: LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False) # 預測測試集結果 y_pred = clf.predict(x_test) print('預測前20個結果為:n',y_pred[:20]) #預測前20個結果為: [21.16289134 19.67630366 22.02458756 24.61877465 14.44016461 23.32107187 16.64386997 14.97085403 33.58043891 17.49079058 25.50429987 36.60653092 25.95062329 28.49744469 19.35133847 20.17145783 25.97572083 18.26842082 16.52840639 17.08939063]
迴歸結果視覺化
# 迴歸結果視覺化 import matplotlib.pyplot as plt from matplotlib import rcParams # 設定中文顯示 rcParams['font.sans-serif'] = 'SimHei' # 設定畫布 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.xlim((0,102)) plt.ylim((0,55)) plt.legend(['真實值','預測值']) # 儲存圖片 plt.savefig('tmp/聚迴歸類結果.png') #展示 plt.show()
迴歸模型的效能評價不同於分類模型,雖然都是對照真實值進行評價,但是由於迴歸模型的預測結果和真實值都是連續地,所以不能夠用之前的精確率、召回率、F1值進行評價。
使用explained_variance_score, mean_absolute_error, mean_squared_error, r2_score, median_absolute_error進行迴歸評價
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)) #Boston傳輸線性迴歸模型的平均絕對誤差為: 3.3775517360082032 #Boston傳輸線性迴歸模型的均方誤差為: 31.15051739031563 #Boston傳輸線性迴歸模型的中值絕對誤差為: 1.7788996425420773 #Boston傳輸線性迴歸模型的可解釋方差值為: 0.710547565009666 #Boston傳輸線性迴歸模型的R方值為: 0.7068961686076838
到此這篇關於Python資料分析之使用scikit-learn構建模型的文章就介紹到這了,更多相關Python scikit-learn構建模型內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45