Python數(shù)據(jù)分析之使用scikit-learn構(gòu)建模型
一、使用sklearn轉(zhuǎn)換器處理
sklearn提供了model_selection模型選擇模塊、preprocessing數(shù)據(jù)預(yù)處理模塊、decompisition特征分解模塊,通過(guò)這三個(gè)模塊能夠?qū)崿F(xiàn)數(shù)據(jù)的預(yù)處理和模型構(gòu)建前的數(shù)據(jù)標(biāo)準(zhǔn)化、二值化、數(shù)據(jù)集的分割、交叉驗(yàn)證和PCA降維處理等工作。
1.加載datasets中的數(shù)據(jù)集
sklearn庫(kù)的datasets模塊集成了部分?jǐn)?shù)據(jù)分析的經(jīng)典數(shù)據(jù)集,可以選用進(jìn)行數(shù)據(jù)預(yù)處理、建模的操作。
常見(jiàn)的數(shù)據(jù)集加載函數(shù)(器):
數(shù)據(jù)集加載函數(shù)(器) | 數(shù)據(jù)集任務(wù)類(lèi)型 |
load_digits | 分類(lèi) |
load_wine | 分類(lèi) |
load_iris | 分類(lèi)、聚類(lèi) |
load_breast_cancer | 分類(lèi)、聚類(lèi) |
load_boston | 回歸 |
fetch_california_housing | 回歸 |
加載后的數(shù)據(jù)集可以看成是一個(gè)字典,幾乎所有的sklearn數(shù)據(jù)集均可以使用data、target、feature_names、DESCR分別獲取數(shù)據(jù)集的數(shù)據(jù)、標(biāo)簽、特征名稱(chēng)、描述信息。
以load_breast_cancer為例:
from sklearn.datasets import load_breast_cancer cancer = load_breast_cancer()##將數(shù)據(jù)集賦值給iris變量 print('breast_cancer數(shù)據(jù)集的長(zhǎng)度為:',len(cancer)) print('breast_cancer數(shù)據(jù)集的類(lèi)型為:',type(cancer)) #breast_cancer數(shù)據(jù)集的長(zhǎng)度為: 6 #breast_cancer數(shù)據(jù)集的類(lèi)型為: <class 'sklearn.utils.Bunch'> cancer_data = cancer['data'] print('breast_cancer數(shù)據(jù)集的數(shù)據(jù)為:','\n',cancer_data) #breast_cancer數(shù)據(jù)集的數(shù)據(jù)為: [[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'] ## 取出數(shù)據(jù)集的標(biāo)簽 print('breast_cancer數(shù)據(jù)集的標(biāo)簽為:\n',cancer_target) #breast_cancer數(shù)據(jù)集的標(biāo)簽為: [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'] ## 取出數(shù)據(jù)集的特征名 print('breast_cancer數(shù)據(jù)集的特征名為:\n',cancer_names) #breast_cancer數(shù)據(jù)集的特征名為: ['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'] ## 取出數(shù)據(jù)集的描述信息 print('breast_cancer數(shù)據(jù)集的描述信息為:\n',cancer_desc) #breast_cancer數(shù)據(jù)集的描述信息為: .. _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.
2.劃分?jǐn)?shù)據(jù)集:訓(xùn)練集、測(cè)試集
在數(shù)據(jù)分析的過(guò)程中,為了保證模型在實(shí)際系統(tǒng)中能夠起到預(yù)期的作用,一般需要將樣本分成獨(dú)立的三部分:訓(xùn)練集(train set)、驗(yàn)證集(validation set)、測(cè)試集(test set)。
訓(xùn)練集—50%:用于估計(jì)模型
驗(yàn)證集—25%:用于確定網(wǎng)絡(luò)結(jié)構(gòu)或控制模型復(fù)雜程度的參數(shù)
測(cè)試集—25%:用于檢驗(yàn)最優(yōu)模型的性能
當(dāng)數(shù)據(jù)總量較少的時(shí)候,使用上述方法劃分就不合適。常用的方法是留少部分做測(cè)試集,然后對(duì)其余N個(gè)樣本采用K折交叉驗(yàn)證法:
將樣本打亂,并均勻分成K份,輪流選擇其中K-1份做訓(xùn)練,剩余一份做檢驗(yàn),計(jì)算預(yù)測(cè)誤差平方和,最后把K次的預(yù)測(cè)誤差平方和的均值作為選擇最優(yōu)模型結(jié)構(gòu)的依據(jù)。
sklearn.model_selection.train_test_split(*arrays,**options)
參數(shù)名稱(chēng) | 說(shuō)明 |
*arrays | 接受一個(gè)或者多個(gè)數(shù)據(jù)集。代表需要?jiǎng)澐值臄?shù)據(jù)集。若為分類(lèi)、回歸,則傳入數(shù)據(jù)、標(biāo)簽;若為聚類(lèi),則傳入數(shù)據(jù) |
test_size | 代表測(cè)試集的大小。若傳入為float類(lèi)型數(shù)據(jù),需要限定在0-1之間,代表測(cè)試集在總數(shù)中的占比;若傳入的為int型數(shù)據(jù),則表示測(cè)試集記錄的絕對(duì)數(shù)目。該參數(shù)與train_size可以只傳入一個(gè)。 |
train_size | 與test_size相同 |
random_state | 接受int。代表隨機(jī)種子編號(hào),相同隨機(jī)種子編號(hào)產(chǎn)生相同的隨機(jī)結(jié)果。 |
shuffle | 接受boolean。代表是否進(jìn)行有回放抽樣,若為T(mén)rue,則stratify參數(shù)必須不能為空。 |
stratify | 接受array或None。若不為None,則使用傳入的標(biāo)簽進(jìn)行分層抽樣。 |
print('原始數(shù)據(jù)集數(shù)據(jù)的形狀為:',cancer_data.shape) print('原始數(shù)據(jù)集標(biāo)簽的形狀為:',cancer_target.shape) 原始數(shù)據(jù)集數(shù)據(jù)的形狀為: (569, 30) 原始數(shù)據(jù)集標(biāo)簽的形狀為: (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('訓(xùn)練集數(shù)據(jù)的形狀為:',cancer_data_train.shape) print('訓(xùn)練集數(shù)據(jù)的標(biāo)簽形狀為:',cancer_target_train.shape) print('測(cè)試集數(shù)據(jù)的形狀為:',cancer_data_test.shape) print('測(cè)試集數(shù)據(jù)的標(biāo)簽形狀為:',cancer_target_test.shape) 訓(xùn)練集數(shù)據(jù)的形狀為: (455, 30) 訓(xùn)練集數(shù)據(jù)的標(biāo)簽形狀為: (455,) 測(cè)試集數(shù)據(jù)的形狀為: (114, 30) 測(cè)試集數(shù)據(jù)的標(biāo)簽形狀為: (114,)
該函數(shù)分別將傳入的數(shù)據(jù)劃分為訓(xùn)練集和測(cè)試集。如果傳入的是一組數(shù)據(jù),那么生成的就是這一組數(shù)據(jù)隨機(jī)劃分后的訓(xùn)練集和測(cè)試集,總共兩組;如果傳入的是兩組數(shù)據(jù),那么生成的訓(xùn)練集和測(cè)試集分別兩組,總共四組。train_test_split方法僅是最常用的數(shù)據(jù)劃分方法,在model_selection模塊中還有其他的劃分函數(shù),例如PredefinedSplit、ShuffleSplit等。
3.使用sklearn轉(zhuǎn)換器進(jìn)行數(shù)據(jù)預(yù)處理與降維
sklearn將相關(guān)的功能封裝為轉(zhuǎn)換器,轉(zhuǎn)換器主要包含有3個(gè)方法:fit、transform、fit_trainsform:
import numpy as np from sklearn.preprocessing import MinMaxScaler # 生成規(guī)則 Scaler = MinMaxScaler().fit(cancer_data_train) # 將規(guī)則應(yīng)用于訓(xùn)練集 cancer_trainScaler = Scaler.transform(cancer_data_train) # 將規(guī)則應(yīng)用于測(cè)試集 cancer_testScaler = Scaler.transform(cancer_data_test) print('離差標(biāo)準(zhǔn)化前訓(xùn)練集數(shù)據(jù)的最小值:',cancer_data_train.min()) print('離差標(biāo)準(zhǔn)化后訓(xùn)練集數(shù)據(jù)的最小值:',np.min(cancer_trainScaler)) print('離差標(biāo)準(zhǔn)化前訓(xùn)練集數(shù)據(jù)的最大值:',np.max(cancer_data_train)) print('離差標(biāo)準(zhǔn)化后訓(xùn)練集數(shù)據(jù)的最大值:',np.max(cancer_trainScaler)) print('離差標(biāo)準(zhǔn)化前測(cè)試集數(shù)據(jù)的最小值:',np.min(cancer_data_test)) print('離差標(biāo)準(zhǔn)化后測(cè)試集數(shù)據(jù)的最小值:',np.min(cancer_testScaler)) print('離差標(biāo)準(zhǔn)化前測(cè)試集數(shù)據(jù)的最大值:',np.max(cancer_data_test)) print('離差標(biāo)準(zhǔn)化后測(cè)試集數(shù)據(jù)的最大值:',np.max(cancer_testScaler)) 離差標(biāo)準(zhǔn)化前訓(xùn)練集數(shù)據(jù)的最小值: 0.0 離差標(biāo)準(zhǔn)化后訓(xùn)練集數(shù)據(jù)的最小值: 0.0 離差標(biāo)準(zhǔn)化前訓(xùn)練集數(shù)據(jù)的最大值: 4254.0 離差標(biāo)準(zhǔn)化后訓(xùn)練集數(shù)據(jù)的最大值: 1.0000000000000002 離差標(biāo)準(zhǔn)化前測(cè)試集數(shù)據(jù)的最小值: 0.0 離差標(biāo)準(zhǔn)化后測(cè)試集數(shù)據(jù)的最小值: -0.057127602776294695 離差標(biāo)準(zhǔn)化前測(cè)試集數(shù)據(jù)的最大值: 3432.0 離差標(biāo)準(zhǔn)化后測(cè)試集數(shù)據(jù)的最大值: 1.3264399566986453
目前利用sklearn能夠?qū)崿F(xiàn)對(duì)傳入的numpy數(shù)組進(jìn)行標(biāo)準(zhǔn)化處理、歸一化處理、、二值化處理和PCA降維處理。前面基于pandas庫(kù)介紹的標(biāo)準(zhǔn)化處理在日常數(shù)據(jù)分析過(guò)程中,各類(lèi)特征處理相關(guān)的操作都需要對(duì)訓(xùn)練集和測(cè)試集分開(kāi)進(jìn)行,需要將訓(xùn)練集中的操作規(guī)則、權(quán)重系數(shù)等應(yīng)用到測(cè)試集中,利用pandas會(huì)使得過(guò)程繁瑣,而sklearn轉(zhuǎn)換器可以輕松實(shí)現(xiàn)。
除了上面展示的離差標(biāo)準(zhǔn)化函數(shù)MinMaxScaler外,還提供了一系列的數(shù)據(jù)預(yù)處理函數(shù):
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 # 生成規(guī)則 pca_model=PCA(n_components=10).fit(cancer_trainScaler) # 將規(guī)則應(yīng)用到訓(xùn)練集 cancer_trainPca = pca_model.transform(cancer_trainScaler) # 將規(guī)則應(yīng)用到測(cè)試集 cancer_testPca = pca_model.transform(cancer_testScaler) print('PCA降維前訓(xùn)練集數(shù)據(jù)的形狀為:',cancer_trainScaler.shape) print('PCA降維后訓(xùn)練集數(shù)據(jù)的形狀為:',cancer_trainPca.shape) print('PCA降維前測(cè)試集數(shù)據(jù)的形狀為:',cancer_testScaler.shape) print('PCA降維后測(cè)試集數(shù)據(jù)的形狀為:',cancer_testPca.shape) PCA降維前訓(xùn)練集數(shù)據(jù)的形狀為: (455, 30) PCA降維后訓(xùn)練集數(shù)據(jù)的形狀為: (455, 10) PCA降維前測(cè)試集數(shù)據(jù)的形狀為: (114, 30) PCA降維后測(cè)試集數(shù)據(jù)的形狀為: (114, 10)
二、構(gòu)建評(píng)價(jià)聚類(lèi)模型
聚類(lèi)分析是在沒(méi)有給定劃分類(lèi)別的情況下,根據(jù)數(shù)據(jù)相似度進(jìn)行樣本分組的一種方法。
1.使用sklearn估計(jì)器構(gòu)建聚類(lèi)模型
聚類(lèi)的輸入是一組未被標(biāo)記的樣本,聚類(lèi)根據(jù)數(shù)據(jù)自身的距離或相似度將它們劃分為若干組,劃分的原則是:組內(nèi)距離最小化,組間距離最大化。
sklearn常用的聚類(lèi)算法模塊cluster提供的聚類(lèi)算法:
聚類(lèi)算法的實(shí)現(xiàn)需要sklearn估計(jì)器(Estimnator),其擁有fit和predict兩個(gè)方法:
方法名稱(chēng) | 說(shuō)明 |
fit | fit方法主要適用于訓(xùn)練算法。該方法可以有效接收用于有監(jiān)督學(xué)習(xí)的訓(xùn)練集及其標(biāo)簽兩個(gè)參數(shù),也可以接收用于無(wú)監(jiān)督學(xué)習(xí)的數(shù)據(jù) |
predict | 用于預(yù)測(cè)有監(jiān)督學(xué)習(xí)的測(cè)試集標(biāo)簽,也可以用于劃分傳入數(shù)據(jù)的類(lèi)別 |
以iris數(shù)據(jù)為例,使用sklearn估計(jì)器構(gòu)建K-Means聚類(lèi)模型:
from sklearn.datasets import load_iris from sklearn.preprocessing import MinMaxScaler from sklearn.cluster import KMeans iris = load_iris() # 加載iris數(shù)據(jù)集 iris_data = iris['data'] # 提取iris數(shù)據(jù)集中的特征 iris_target = iris['target'] # 提取iris數(shù)據(jù)集中的標(biāo)簽 iris_feature_names = iris['feature_names'] #提取iris數(shù)據(jù)集中的特征名稱(chēng) scale = MinMaxScaler().fit(iris_data) # 對(duì)數(shù)據(jù)集中的特征設(shè)定訓(xùn)練規(guī)則 iris_dataScale = scale.transform(iris_data) # 應(yīng)用規(guī)則 kmeans = KMeans(n_clusters=3,random_state=123).fit(iris_dataScale) # 構(gòu)建并訓(xùn)練模型 print('構(gòu)建的K-Means模型為:\n',kmeans) #構(gòu)建的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)
聚類(lèi)完成后可以通過(guò)sklearn的manifold模塊中的TXNE函數(shù)實(shí)現(xiàn)多維數(shù)據(jù)的可視化展現(xiàn)。
import pandas as pd from sklearn.manifold import TSNE import matplotlib.pyplot as plt # 使用TSNE進(jìn)行數(shù)據(jù)降維,降成2維 tsne = TSNE(n_components=2,init='random',random_state=177).fit(iris_data) df = pd.DataFrame(tsne.embedding_) # 將原始數(shù)據(jù)轉(zhuǎn)換為DataFrame df['labels'] = kmeans.labels_ # 將聚類(lèi)結(jié)果存儲(chǔ)進(jìn)df數(shù)據(jù)表 # 提取不同標(biāo)簽的數(shù)據(jù) df1 = df[df['labels']==0] df2 = df[df['labels']==1] df3 = df[df['labels']==2] # 繪制圖形 # 繪制畫(huà)布大小 fig = plt.figure(figsize=(9,6)) # 用不同顏色表示不同數(shù)據(jù) plt.plot(df1[0],df1[1],'bo',df2[0],df2[1],'r*',df3[0],df3[1],'gD') # 保存圖片 plt.savefig('tmp/聚類(lèi)結(jié)果.png') # 展示 plt.show()
2.評(píng)價(jià)聚類(lèi)模型
聚類(lèi)評(píng)價(jià)的標(biāo)準(zhǔn)是組內(nèi)的對(duì)象相互之間是相似的,而不同組間的對(duì)象是不同的,即組內(nèi)相似性越大,組間差別性越大,聚類(lèi)效果越好。
注意:
1.前四種方法需要真實(shí)值的配合才能夠評(píng)價(jià)聚類(lèi)算法的優(yōu)劣,更具有說(shuō)服力,并且在實(shí)際操作中,有真實(shí)值參考下,聚類(lèi)方法的評(píng)價(jià)可以等同于分類(lèi)算法的評(píng)價(jià)。
2.除了輪廓系數(shù)評(píng)價(jià)法以外的評(píng)價(jià)方法,在不考慮業(yè)務(wù)場(chǎng)景的情況下都是分?jǐn)?shù)越高越好,最高分為1,而輪廓系數(shù)評(píng)價(jià)法需要判斷不同類(lèi)別數(shù)目情況下的輪廓系數(shù)的走勢(shì),尋找最優(yōu)的聚類(lèi)數(shù)目。
FMI評(píng)價(jià)法
from sklearn.datasets import load_irisiris = load_iris() # 加載iris數(shù)據(jù)集iris_data = iris['data'] # 提取數(shù)據(jù)集特征 iris_target = iris['target'] # 提取數(shù)據(jù)集標(biāo)簽 from sklearn.metrics import fowlkes_mallows_score from sklearn.cluster import KMeans for i in range(2,7): # 構(gòu)建并訓(xùn)練模型 kmeans = KMeans(n_clusters=i,random_state=123).fit(iris_data) score = fowlkes_mallows_score(iris_target,kmeans.labels_) print('iris數(shù)據(jù)聚%d類(lèi)FMI評(píng)價(jià)分值為:%f'%(i,score)) iris數(shù)據(jù)聚2類(lèi)FMI評(píng)價(jià)分值為:0.750473 iris數(shù)據(jù)聚3類(lèi)FMI評(píng)價(jià)分值為:0.820808 iris數(shù)據(jù)聚4類(lèi)FMI評(píng)價(jià)分值為:0.756593 iris數(shù)據(jù)聚5類(lèi)FMI評(píng)價(jià)分值為:0.725483 iris數(shù)據(jù)聚6類(lèi)FMI評(píng)價(jià)分值為:0.614345
通過(guò)結(jié)果可以看出來(lái),當(dāng)聚類(lèi)為3時(shí)FMI評(píng)價(jià)分最高,所以當(dāng)聚類(lèi)3的時(shí)候,K-Means模型最好。
輪廓系數(shù)評(píng)價(jià)法
from sklearn.datasets import load_irisiris = load_iris() # 加載iris數(shù)據(jù)集iris_data = iris['data'] # 提取數(shù)據(jù)集特征 iris_target = iris['target'] # 提取數(shù)據(jù)集標(biāo)簽 from sklearn.metrics import silhouette_score from sklearn.cluster import KMeans import matplotlib.pyplot as plt silhouettteScore = [] for i in range(2,15): ##構(gòu)建并訓(xùn)練模型 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()
從圖形可以看出,聚類(lèi)數(shù)目為2、3和5、6時(shí)平均畸變程度最大。由于iris數(shù)據(jù)本身就是3種鳶尾花的花瓣、花萼長(zhǎng)度和寬度的數(shù)據(jù),側(cè)面說(shuō)明了聚類(lèi)數(shù)目為3的時(shí)候效果最佳。
Calinski_Harabasz指數(shù)評(píng)價(jià)法
from sklearn.datasets import load_irisiris = load_iris() # 加載iris數(shù)據(jù)集iris_data = iris['data'] # 提取數(shù)據(jù)集特征 iris_target = iris['target'] # 提取數(shù)據(jù)集標(biāo)簽 from sklearn.metrics import silhouette_score from sklearn.cluster import KMeans from sklearn.metrics import calinski_harabasz_score for i in range(2,7): ##構(gòu)建并訓(xùn)練模型 kmeans = KMeans(n_clusters = i,random_state=123).fit(iris_data) score = calinski_harabasz_score(iris_data,kmeans.labels_) print('iris數(shù)據(jù)聚%d類(lèi)calinski_harabaz指數(shù)為:%f'%(i,score)) iris數(shù)據(jù)聚2類(lèi)calinski_harabaz指數(shù)為:513.924546 iris數(shù)據(jù)聚3類(lèi)calinski_harabaz指數(shù)為:561.627757 iris數(shù)據(jù)聚4類(lèi)calinski_harabaz指數(shù)為:530.765808 iris數(shù)據(jù)聚5類(lèi)calinski_harabaz指數(shù)為:495.541488 iris數(shù)據(jù)聚6類(lèi)calinski_harabaz指數(shù)為:469.836633
同樣可以看出在聚類(lèi)為3時(shí),K-Means模型為最優(yōu)。綜合以上評(píng)價(jià)方法的使用,在有真實(shí)值參考時(shí),幾種方法都能有效的展示評(píng)估聚合模型;在沒(méi)有真實(shí)值參考時(shí),可以將輪廓系數(shù)評(píng)價(jià)與Calinski_Harabasz指數(shù)評(píng)價(jià)相結(jié)合使用。
三、構(gòu)建評(píng)價(jià)分類(lèi)模型
分類(lèi)是指構(gòu)造一個(gè)分類(lèi)模型,輸入樣本的特征值,輸出對(duì)應(yīng)類(lèi)別,將每個(gè)樣本映射到預(yù)先定義好的類(lèi)別。分類(lèi)模型是建立在自己已有類(lèi)標(biāo)記的數(shù)據(jù)集上,屬于有監(jiān)督學(xué)習(xí)。在實(shí)際應(yīng)用場(chǎng)景中,分類(lèi)算法被應(yīng)用在行為分析、物品識(shí)別、圖像檢測(cè)等。
1.使用sklearn估計(jì)器構(gòu)建分類(lèi)模型
以breast_cancer數(shù)據(jù)集為例,使用sklearn估計(jì)器構(gòu)建支持向量機(jī)(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'] ## 將數(shù)據(jù)劃分為訓(xùn)練集測(cè)試集 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) ## 數(shù)據(jù)標(biāo)準(zhǔn)化 stdScaler = StandardScaler().fit(cancer_data_train) # 設(shè)定標(biāo)準(zhǔn)化規(guī)則 cancer_trainStd = stdScaler.transform(cancer_data_train) # 將標(biāo)準(zhǔn)化規(guī)則應(yīng)用到訓(xùn)練集 cancer_testStd = stdScaler.transform(cancer_data_test) # 將標(biāo)準(zhǔn)化規(guī)則應(yīng)用到測(cè)試集 ## 建立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) ## 預(yù)測(cè)訓(xùn)練集結(jié)果 cancer_target_pred = svm.predict(cancer_testStd) print('預(yù)測(cè)前20個(gè)結(jié)果為:\n',cancer_target_pred[:20]) #預(yù)測(cè)前20個(gè)結(jié)果為: [1 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1]
## 求出預(yù)測(cè)和真實(shí)一樣的數(shù)目 true = np.sum(cancer_target_pred == cancer_target_test ) print('預(yù)測(cè)對(duì)的結(jié)果數(shù)目為:', true) print('預(yù)測(cè)錯(cuò)的的結(jié)果數(shù)目為:', cancer_target_test.shape[0]-true) print('預(yù)測(cè)結(jié)果準(zhǔn)確率為:', true/cancer_target_test.shape[0]) 預(yù)測(cè)對(duì)的結(jié)果數(shù)目為: 111 預(yù)測(cè)錯(cuò)的的結(jié)果數(shù)目為: 3 預(yù)測(cè)結(jié)果準(zhǔn)確率為: 0.9736842105263158
2.評(píng)價(jià)分類(lèi)模型
分類(lèi)模型對(duì)測(cè)試集進(jìn)行預(yù)測(cè)而得出的準(zhǔn)確率并不能很好地反映模型的性能,為了有效判斷一個(gè)預(yù)測(cè)模型的性能表現(xiàn),需要結(jié)合真實(shí)值計(jì)算出精確率、召回率、F1值、Cohen’s Kappa系數(shù)等指標(biāo)來(lái)衡量。
使用單一評(píng)價(jià)指標(biāo)(Precision、Recall、F1值、Cohen’s Kappa系數(shù))
from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,cohen_kappa_scoreprint('使用SVM預(yù)測(cè)breast_cancer數(shù)據(jù)的準(zhǔn)確率為:', accuracy_score(cancer_target_test,cancer_target_pred)) print('使用SVM預(yù)測(cè)breast_cancer數(shù)據(jù)的精確率為:', precision_score(cancer_target_test,cancer_target_pred)) print('使用SVM預(yù)測(cè)breast_cancer數(shù)據(jù)的召回率為:', recall_score(cancer_target_test,cancer_target_pred)) print('使用SVM預(yù)測(cè)breast_cancer數(shù)據(jù)的F1值為:', f1_score(cancer_target_test,cancer_target_pred)) print('使用SVM預(yù)測(cè)breast_cancer數(shù)據(jù)的Cohen’s Kappa系數(shù)為:', cohen_kappa_score(cancer_target_test,cancer_target_pred)) 使用SVM預(yù)測(cè)breast_cancer數(shù)據(jù)的準(zhǔn)確率為: 0.9736842105263158 使用SVM預(yù)測(cè)breast_cancer數(shù)據(jù)的精確率為: 0.9594594594594594 使用SVM預(yù)測(cè)breast_cancer數(shù)據(jù)的召回率為: 1.0 使用SVM預(yù)測(cè)breast_cancer數(shù)據(jù)的F1值為:0.9793103448275862 使用SVM預(yù)測(cè)breast_cancer數(shù)據(jù)的Cohen’s Kappa系數(shù)為: 0.9432082364662903
sklearn模塊除了提供了Precision等單一評(píng)價(jià)指標(biāo)外,還提供了一個(gè)能夠輸出分類(lèi)模型評(píng)價(jià)報(bào)告的函數(shù)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預(yù)測(cè)iris數(shù)據(jù)的分類(lèi)報(bào)告為:\n', classification_report(cancer_target_test,cancer_target_pred))#使用SVM預(yù)測(cè)iris數(shù)據(jù)的分類(lèi)報(bào)告為: 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) # 設(shè)置畫(huà)布 plt.figure(figsize=(10,6)) plt.xlim(0,1) ##設(shè)定x軸的范圍 plt.ylim(0.0,1.1) ## 設(shè)定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曲線橫縱坐標(biāo)范圍是[0,1],通常情況下,ROC曲線與x軸形成的面積越大,表示模型性能越好。當(dāng)ROC曲線如虛線所示時(shí),表明模型的計(jì)算結(jié)果基本都是隨機(jī)得來(lái)的,此時(shí)模型起到的作用幾乎為0.
四、構(gòu)建評(píng)價(jià)回歸模型
回歸算法的實(shí)現(xiàn)過(guò)程與分類(lèi)算法相似,原理相差不大。分類(lèi)和回歸的主要區(qū)別在于,分類(lèi)算法的標(biāo)簽是離散的,但是回歸算法的標(biāo)簽是連續(xù)的?;貧w算法在交通、物流、社交、網(wǎng)絡(luò)等領(lǐng)域發(fā)揮作用巨大。
1.使用sklearn估計(jì)器構(gòu)建回歸模型
在回歸模型中,自變量和因變量具有相關(guān)關(guān)系,自變量的值是已知的,因變量的值是要預(yù)測(cè)的?;貧w算法的實(shí)現(xiàn)步驟和分類(lèi)算法基本相同,分為學(xué)習(xí)和預(yù)測(cè)兩個(gè)步驟。
學(xué)習(xí):通過(guò)訓(xùn)練樣本來(lái)擬合回歸方程
預(yù)測(cè):利用學(xué)習(xí)過(guò)程中擬合出的方程,將測(cè)試數(shù)據(jù)放入方程中求出預(yù)測(cè)值。
from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression # 加載boston數(shù)據(jù)集 boston = load_boston() # 提取數(shù)據(jù) x = boston['data'] y = boston['target'] names = boston['feature_names'] # 將數(shù)據(jù)劃分為訓(xùn)練集和測(cè)試集 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ù)測(cè)測(cè)試集結(jié)果 y_pred = clf.predict(x_test) print('預(yù)測(cè)前20個(gè)結(jié)果為:\n',y_pred[:20]) #預(yù)測(cè)前20個(gè)結(jié)果為: [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]
回歸結(jié)果可視化
# 回歸結(jié)果可視化 import matplotlib.pyplot as plt from matplotlib import rcParams # 設(shè)置中文顯示 rcParams['font.sans-serif'] = 'SimHei' # 設(shè)置畫(huà)布 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='-.') # 設(shè)置圖像屬性 plt.xlim((0,102)) plt.ylim((0,55)) plt.legend(['真實(shí)值','預(yù)測(cè)值']) # 保存圖片 plt.savefig('tmp/聚回歸類(lèi)結(jié)果.png') #展示 plt.show()
2.評(píng)價(jià)回歸模型
回歸模型的性能評(píng)價(jià)不同于分類(lèi)模型,雖然都是對(duì)照真實(shí)值進(jìn)行評(píng)價(jià),但是由于回歸模型的預(yù)測(cè)結(jié)果和真實(shí)值都是連續(xù)地,所以不能夠用之前的精確率、召回率、F1值進(jìn)行評(píng)價(jià)。
使用explained_variance_score, mean_absolute_error, mean_squared_error, r2_score, median_absolute_error進(jìn)行回歸評(píng)價(jià)
from sklearn.metrics import explained_variance_score,mean_absolute_error,mean_squared_error,\median_absolute_error,r2_score print('Boston數(shù)據(jù)線性回歸模型的平均絕對(duì)誤差為:', mean_absolute_error(y_test,y_pred)) print('Boston數(shù)據(jù)線性回歸模型的均方誤差為:', mean_squared_error(y_test,y_pred)) print('Boston數(shù)據(jù)線性回歸模型的中值絕對(duì)誤差為:', median_absolute_error(y_test,y_pred)) print('Boston數(shù)據(jù)線性回歸模型的可解釋方差值為:', explained_variance_score(y_test,y_pred)) print('Boston數(shù)據(jù)線性回歸模型的R方值為:', r2_score(y_test,y_pred)) #Boston數(shù)據(jù)線性回歸模型的平均絕對(duì)誤差為: 3.3775517360082032 #Boston數(shù)據(jù)線性回歸模型的均方誤差為: 31.15051739031563 #Boston數(shù)據(jù)線性回歸模型的中值絕對(duì)誤差為: 1.7788996425420773 #Boston數(shù)據(jù)線性回歸模型的可解釋方差值為: 0.710547565009666 #Boston數(shù)據(jù)線性回歸模型的R方值為: 0.7068961686076838
到此這篇關(guān)于Python數(shù)據(jù)分析之使用scikit-learn構(gòu)建模型的文章就介紹到這了,更多相關(guān)Python scikit-learn構(gòu)建模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python數(shù)據(jù)分析應(yīng)用之Matplotlib數(shù)據(jù)可視化詳情
- python數(shù)據(jù)分析之單因素分析線性擬合及地理編碼
- python數(shù)據(jù)分析繪圖可視化
- Python數(shù)據(jù)分析基礎(chǔ)之異常值檢測(cè)和處理方式
- Python數(shù)據(jù)分析numpy數(shù)組的3種創(chuàng)建方式
- Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化
- Python數(shù)據(jù)分析matplotlib折線圖案例處理
- Python數(shù)據(jù)分析之堆疊數(shù)組函數(shù)示例總結(jié)
- 使用python對(duì)泰坦尼克號(hào)幸存者進(jìn)行數(shù)據(jù)分析與預(yù)測(cè)
相關(guān)文章
淺析Python數(shù)字類(lèi)型和字符串類(lèi)型的內(nèi)置方法
這篇文章主要介紹了Python數(shù)字類(lèi)型和字符串類(lèi)型的內(nèi)置方法,本文通過(guò)實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12django從后臺(tái)返回html代碼的實(shí)例
這篇文章主要介紹了django從后臺(tái)返回html代碼的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Python3實(shí)現(xiàn)連接SQLite數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Python3實(shí)現(xiàn)連接SQLite數(shù)據(jù)庫(kù)的方法,在Python數(shù)據(jù)庫(kù)編程中有著廣泛的應(yīng)用,需要的朋友可以參考下2014-08-08Python3 實(shí)現(xiàn)爬取網(wǎng)站下所有URL方式
今天小編就為大家分享一篇Python3 實(shí)現(xiàn)爬取網(wǎng)站下所有URL方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01python多進(jìn)程使用apply_async的使用方法詳解
這篇文章主要介紹了python多進(jìn)程使用apply_async使用方法詳解,apply_async是異步非阻塞式,不用等待當(dāng)前進(jìn)程執(zhí)行完畢,隨時(shí)跟進(jìn)操作系統(tǒng)調(diào)度來(lái)進(jìn)行進(jìn)程切換,即多個(gè)進(jìn)程并行執(zhí)行,提高程序的執(zhí)行效率2022-09-09使用Jest?在?Visual?Studio?Code?中進(jìn)行單元測(cè)試的流程分析
Jest是一個(gè)流行的JavaScript測(cè)試框架,它提供了簡(jiǎn)潔、靈活和強(qiáng)大的工具來(lái)編寫(xiě)和運(yùn)行單元測(cè)試,今天通過(guò)本文給大家介紹使用Jest在Visual Studio Code中進(jìn)行單元測(cè)試的流程分析,感興趣的朋友跟隨小編一起看看吧2023-07-07通過(guò)Python實(shí)現(xiàn)Payload分離免殺過(guò)程詳解
這篇文章主要介紹了通過(guò)Python實(shí)現(xiàn)Payload分離免殺過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07PyTorch中torch.load()的用法和應(yīng)用
torch.load()它用于加載由torch.save()保存的模型或張量,本文主要介紹了PyTorch中torch.load()的用法和應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03使用python實(shí)現(xiàn)男神女神顏值打分系統(tǒng)(推薦)
這篇文章主要介紹了用python做一個(gè)男神女神顏值打分系統(tǒng)(程序分析見(jiàn)注釋?zhuān)?需要的朋友可以參考下2019-10-10