PimaIndiansdiabetes-数据预处理实验(一)
有趣的事,Python永遠不會缺席!
如需轉發,請注明出處:小婷兒的pythonhttps://www.cnblogs.com/xxtalhr/p/10859517.html
鏈接:https://pan.baidu.com/s/1PyP_r8BMnLLE-2fkKEPqKA
提取碼:vztm
一、PimaIndiansdiabetes.csv 數據集介紹
1、該數據集最初來自國家糖尿病/消化/腎臟疾病研究所。數據集的目標是基于數據集中包含的某些診斷測量來診斷性的預測 患者是否患有糖尿病。
2、從較大的數據庫中選擇這些實例有幾個約束條件。尤其是,這里的所有患者都是Pima印第安至少21歲的女性。
3、數據集由多個醫學預測變量和一個目標變量組成Outcome。預測變量包括患者的懷孕次數、BMI、胰島素水平、年齡等。
4、數據集的內容是皮馬人的醫療記錄,以及過去5年內是否有糖尿病。所有的數據都是數字,問題是(是否有糖尿病是1或0),是二分類問題。數據有8個屬性,1個類別:
【1】Pregnancies:懷孕次數
【2】Glucose:葡萄糖
【3】BloodPressure:血壓 (mm Hg)
【4】SkinThickness:皮層厚度 (mm)
【5】Insulin:胰島素 2小時血清胰島素(mu U / ml
【6】BMI:體重指數 (體重/身高)^2
【7】DiabetesPedigreeFunction:糖尿病譜系功能
【8】Age:年齡 (歲)
【9】Outcome:類標變量 (0或1)
二、數據預處理思考
1、首先要明確有多少特征,哪些是連續的,哪些是類別的。
2、檢查有沒有缺失值,對確實的特征選擇恰當方式進行彌補,使數據完整。
3、對連續的數值型特征進行標準化,使得均值為0,方差為1。
4、對類別型的特征進行one-hot編碼。
5、將需要轉換成類別型數據的連續型數據進行二值化。
6、為防止過擬合或者其他原因,選擇是否要將數據進行正則化。
7、在對數據進行初探之后發現效果不佳,可以嘗試使用多項式方法,尋找非線性的關系。
8、根據實際問題分析是否需要對特征進行相應的函數轉換。
三、數據的讀取
1 import pandas as pd # 數據科學計算工具
2 import numpy as np # 數值計算工具
3 import matplotlib.pyplot as plt # 可視化
4 import seaborn as sns # matplotlib的高級API
5 %matplotlib inline # 在Notebook里面作圖/嵌圖
6
7
8 pima = pd.read_csv('C:AIAI_datasetsPimaIndiansdiabetes.csv')
9 pima.head()
1 pima.describe() # panda的describe描述屬性,展示了每一個字段的,【count條目統計,mean平均值,std標準值,min最小值,25%,50%中位數,75%,max最大值】
1 pima.groupby('Outcome').size() #按照是否發病分組,并展示每組的大小
四、Data Visualization - 數據可視化
1 pima.hist(figsize=(16, 14)); 2 #查看每個字段的數據分布;figsize的參數顯示的是每個子圖的長和寬 3 # 后面加個分號就不會出現下面的輸出 4 # array([[<matplotlib.axes._subplots.AxesSubplot object at 0x00000235316A7C50>, 5 # <matplotlib.axes._subplots.AxesSubplot object at 0x00000235319287B8>, 6 # <matplotlib.axes._subplots.AxesSubplot object at 0x0000023531945E48>], 7 # [<matplotlib.axes._subplots.AxesSubplot object at 0x0000023531977518>, 8 # <matplotlib.axes._subplots.AxesSubplot object at 0x000002353199FBA8>, 9 # <matplotlib.axes._subplots.AxesSubplot object at 0x000002353199FBE0>], 10 # [<matplotlib.axes._subplots.AxesSubplot object at 0x0000023531EA8908>, 11 # <matplotlib.axes._subplots.AxesSubplot object at 0x0000023531ED1F98>, 12 # <matplotlib.axes._subplots.AxesSubplot object at 0x0000023531F03668>]], 13 # dtype=object)
1 sns.pairplot(pima, vars=pima.columns,hue = 'Outcome') 2 3 # 報錯LinAlgError: singular matrix
1 sns.pairplot(pima, vars=pima.columns[:-1], hue='Outcome') 2 plt.show() 3 4 # seaborn常用命令 5 #【1】set_style()是用來設置主題的,Seaborn有5個預設好的主題:darkgrid、whitegrid、dark、white、ticks,默認為darkgrid 6 #【2】set()通過設置參數可以用來設置背景,調色板等,更加常用 7 #【3】displot()為hist加強版 8 #【4】kdeplot()為密度曲線圖 9 #【5】boxplot()為箱圖 10 #【6】joinplot()聯合分布圖 11 #【7】heatmap()熱點圖 12 #【8】pairplot()多變量圖,可以支持各種類型的變量分析,是特征分析很好用的工具 13 # data:必不可少的數據;hue:用一個特征來顯示圖像上的顏色,類似于打標簽;vars:只留幾個特征兩兩比較,否則使用data的全部變量;
1 sns.pairplot(pima,diag_kind='hist', hue='Outcome') 2 3 #通過設置diag_kind='hist',對角線是直方圖
1 pima.plot(kind='box', subplots=True, layout=(3,3), sharex=False,sharey=False, figsize=(16,14)); 2 3 # 箱線圖(Boxplot)也稱箱須圖(Box-whisker Plot),是利用數據中的五個統計量:最小值、第一四分位數、中位數、第三四分位數與最大值 4 # 來描述數據的一種方法,它也可以粗略地看出數據是否具有有對稱性,分布的分散程度等信息,特別可以用于對幾個樣本的比較。 5 # 通過盒圖,在分析數據的時候,盒圖能夠有效地幫助我們識別數據的特征: 6 # 直觀地識別數據集中的異常值(查看離群點)。 7 # 判斷數據集的數據離散程度和偏向(觀察盒子的長度,上下隔間的形狀,以及胡須的長度)。 8 9 #pandas.plot作圖:數據分為Series 和 DataFrame兩種類型;現釋義數據為DataFrame的參數 10 11 #【0】data:DataFrame 12 #【1】x:label or position,default None 指數據框列的標簽或位置參數 13 #【2】y:label or position,default None 指數據框列的標簽或位置參數 14 #【3】kind:str(line折線圖、bar條形圖、barh橫向條形圖、hist柱狀圖、 15 # box箱線圖、kde Kernel的密度估計圖,主要對柱狀圖添加Kernel概率密度線、 16 # density same as “kde”、area區域圖、pie餅圖、scatter散點圖、hexbin) 17 #【4】subplots:boolean,default False,為每一列單獨畫一個子圖 18 #【5】sharex:boolean,default True if ax is None else False 19 #【6】sharey:boolean,default False 20 #【7】loglog:boolean,default False,x軸/y軸同時使用log刻度
1 corr = pima.corr() # 計算變量的相關系數,得到一個N * N的矩陣 2 3 plt.subplots(figsize=(14,12)) # 可以先試用plt設置畫布的大小,然后在作圖,修改 4 sns.heatmap(corr, annot = True) # 使用熱度圖可視化這個相關系數矩陣 5 6 7 # 其生成的原理簡單概括為四個步驟: 8 9 # (1)為離散點設定一個半徑,創建一個緩沖區; 10 11 # (2)對每個離散點的緩沖區,使用漸進的灰度帶(完整的灰度帶是0~255)從內而外,由淺至深地填充; 12 13 # (3)由于灰度值可以疊加(值越大顏色越亮,在灰度帶中則顯得越白。在實際中,可以選擇ARGB模型中任一通道作為疊加灰度值), 14 # 從而對于有緩沖區交叉的區域,可以疊加灰度值,因而緩沖區交叉的越多,灰度值越大,這塊區域也就越“熱”; 15 16 # (4)以疊加后的灰度值為索引,從一條有256種顏色的色帶中(例如彩虹色)映射顏色,并對圖像重新著色,從而實現熱點圖。
五、Feature Extraction 特征提取
1 # 導入和特征選擇相關的包 2 from sklearn.feature_selection import SelectKBest 3 from sklearn.feature_selection import chi2 4 5 # SelectKBest() 只保留K個最高分的特征 6 # SelectPercentile() 只保留用戶指定百分比的最高得分的特征 7 # 使用常見的單變量統計檢驗:假正率SelectFpr,錯誤發現率SelectFdr,或者總體錯誤率SelectFwe 8 # GenericUnivariateSelect通過結構化策略進行特征選擇,通過超參數搜索估計器進行特征選擇 9 10 # SelectKBest()和SelectPercentile()能夠返回特征評價的得分和P值 11 # 12 # sklearn.feature_selection.SelectPercentile(score_func=<function f_classif>, percentile=10) 13 # sklearn.feature_selection.SelectKBest(score_func=<function f_classif>, k=10) 14 15 # 其中的參數score_func有以下選項: 16 17 #【1】回歸:f_regression:相關系數,計算每個變量與目標變量的相關系數,然后計算出F值和P值 18 # mutual_info_regression:互信息,互信息度量X和Y共享的信息: 19 # 它度量知道這兩個變量其中一個,對另一個不確定度減少的程度。 20 #【2】分類:chi2:卡方檢驗 21 # f_classif:方差分析,計算方差分析(ANOVA)的F值(組間均方/組內均方); 22 # mutual_info_classif:互信息,互信息方法可以捕捉任何一種統計依賴,但是作為非參數方法, 23 # 需要更多的樣本進行準確的估計。
1 X = pima.iloc[:, 0:8] # 特征列 0-7列,不含第8列 2 Y = pima.iloc[:, 8] # 目標列為第8列 3 4 select_top_4 = SelectKBest(score_func=chi2, k=4) # 通過卡方檢驗選擇4個得分最高的特征 5 6 7 fit = select_top_4.fit(X, Y) # 獲取特征信息和目標值信息 8 features = fit.transform(X) # 特征轉換 9 10 # 構造新特征DataFrame 11 X_features = pd.DataFrame(data = features, columns=['Glucose','Insulin','BMI','Age']) 12 13 X_features.head()
六、Standardization - 標準化
1 # 它將屬性值更改為 均值為0,標準差為1 的 高斯分布. 2 # 當算法期望輸入特征處于高斯分布時,它非常有用 3 4 from sklearn.preprocessing import StandardScaler 5 6 # StandardScaler 7 # 作用:去均值和方差歸一化。且是針對每一個特征維度來做的,而不是針對樣本。 8 #StandardScaler對每列分別標準化, 9 # 因為shape of data: [n_samples, n_features] 10 # 【注:】 并不是所有的標準化都能給estimator帶來好處。
1 rescaledX = StandardScaler().fit_transform( 2 X_features) # 通過sklearn的preprocessing數據預處理中StandardScaler特征縮放 標準化特征信息 3 X = pd.DataFrame(data=rescaledX, columns=X_features.columns) # 構建新特征DataFrame 4 X.head()
七、機器學習 - 構建二分類算法模型
1 from sklearn.model_selection import KFold 2 from sklearn.model_selection import cross_val_score 3 from sklearn.linear_model import LogisticRegression 4 from sklearn.naive_bayes import GaussianNB 5 from sklearn.neighbors import KNeighborsClassifier 6 from sklearn.tree import DecisionTreeClassifier 7 from sklearn.svm import SVC 8 from sklearn.model_selection import train_test_split 9 10 # 切分數據集為:特征訓練集、特征測試集、目標訓練集、目標測試集 11 X_train, X_test, Y_train, Y_test = train_test_split( 12 X, Y, random_state=2019, test_size=0.2)
1 models = []
2 models.append(("LR", LogisticRegression())) #邏輯回歸
3 models.append(("NB", GaussianNB())) # 高斯樸素貝葉斯
4 models.append(("KNN", KNeighborsClassifier())) #K近鄰分類
5 models.append(("DT", DecisionTreeClassifier())) #決策樹分類
6 models.append(("SVM", SVC())) # 支持向量機分類
1 import warnings
2 warnings.filterwarnings('ignore') #消除警告
3
4 results = []
5 names = []
6 for name, model in models:
7 kflod = KFold(n_splits=10, random_state=2019)
8 cv_result = cross_val_score(
9 model, X_train, Y_train, cv=kflod, scoring='accuracy')
10 names.append(name)
11 results.append(cv_result)
12 print(results,names)
13
14 print('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++')
15 for i in range(len(names)):
16 print(names[i], results[i].mean)
八、 基于PCA和網格搜索SVM參數
# 1、PCA是常用的提取數據的手段,其功能為提取主成分(主要信息),摒棄冗余信息(次要# 信息),從而得到壓縮后的數據,實現維度的下降。 # 2、其設想通過投影矩陣將高維信息轉換到另一個坐標系下,并通過平移將數據均值變為零。# PCA認為,在變換過后的數據中,在某一維度上,數據分布的更分散,則認為對數據點分布# # 情況的解釋力就更強。故在PCA中,通過方差來衡量數據樣本在各個方向上投影的分布情# # 況,進# 而對有效的低維方向進行選擇。 # 3、KernelPCA是PCA的一個改進版,它將非線性可分的數據轉換到一個適合對齊進行線性分# 類的新的低維子空間上,核PCA可以通過非線性映射將數據轉換到一個高維空間中,在高維# # 空間中使用PCA將其映射到另一個低維空間中,并通過線性分類器對樣本進行劃分。 # 4、核函數:通過兩個向量點積來度量向量間相似度的函數。常用函數有:多項式核、雙曲正# 切核、徑向基和函數(RBF)(高斯核函數)等。 # 5、KPCA和PCA都是用來做無監督數據處理的,但是有一點不一樣。PCA是降維,把m維的# 數據降至k維。KPCA恰恰相反,它是把m維的數據升至k維。但是他們共同的目標都是讓數# # 據在目標維度中(線性)可分,即PCA的最大可分性。在sklearn中,kpca和pca的使用基本一# 致,接口都是一樣的。kpca需要指定核函數,不然默認線性核。
1 # 【1】 Applying Kernel PCA 2 3 from sklearn.decomposition import KernelPCA 4 5 kpca = KernelPCA(n_components=2, kernel='rbf') 6 X_train_pca = kpca.fit_transform(X_train) 7 X_test_pca = kpca.transform(X_test) 8 9 # fit和transform沒有任何關系,僅僅是數據處理的兩個不同環節,之所以出來fit_transform這個函數名,僅僅是為了寫代碼方便,會高效一點。 10 11 # sklearn里的封裝好的各種算法使用前都要fit,fit相對于整個代碼而言,為后續API服務。fit之后,然后調用各種API方法, 12 # transform只是其中一個API方法,所以當你調用transform之外的方法,也必須要先fit。 13 14 # fit原義指的是安裝、使適合的意思,其實有點train的含義,但是和train不同的是,它并不是一個訓練的過程,而是一個適配的過程, 15 # 過程都是確定的,最后得到一個可用于轉換的有價值的信息。 16 17 # 1、必須先用fit_transform(trainData),之后再transform(testData) 18 # 2、如果直接transform(testData),程序會報錯 19 # 3、如果fit_transfrom(trainData)后,使用fit_transform(testData)而不transform(testData),雖然也能歸一化, 20 # 但是兩個結果不是在同一個“標準”下的,具有明顯差異。(一定要避免這種情況) 21 22 # 4、fit_transform()干了兩件事:fit找到數據轉換規則,并將數據標準化 23 # 5、transform()可以直接把轉換規則拿來用,所以并不需要fit_transform(),否則,兩次標準化后的數據格式就不一樣了
九、 SVM旨在將一組不可線性分割的數據線性分割
# 核函數:通過兩個向量點積來度量向量間相似度的函數。常用函數有:多項式核、雙曲正切核、徑向基和函數(RBF)(高斯核函數)等。 # 這些函數中應用最廣的應該就是RBF核了,無論是小樣本還是大樣本,高維還是低維等情況,RBF核函數均適用,它相比其他的函數有一下優點: # 1)RBF核函數可以將一個樣本映射到一個更高維的空間,而且線性核函數是RBF的一個特例,也就是說如果考慮使用RBF,那么就沒有必要考慮線性核函數了。 # 2)與多項式核函數相比,RBF需要確定的參數要少,核函數參數的多少直接影響函數的復雜程度。另外,當多項式的階數比較高時,核矩陣的元素值將趨于無窮大或無窮小,而RBF則在上,會減少數值的計算困難。 # 3)對于某些參數,RBF和sigmoid具有相似的性能。
X_train.shape,X_test.shape,X_train_pca.shape,X_test_pca.shape,Y_train.shape
1 plt.figure(figsize=(10,8))
2 plt.scatter(X_train_pca[:,0], X_train_pca[:,1],c=Y_train,cmap='plasma')
3 plt.xlabel("First principal component")
4 plt.ylabel("Second principal component")
十、SVC
1 #classification_report簡介 2 # sklearn中的classification_report函數用于顯示主要分類指標的文本報告.在報告中顯示每個類的精確度,召回率,F1值等信息。 主要參數: 3 # y_true:1維數組,或標簽指示器數組/稀疏矩陣,目標值。 4 # y_pred:1維數組,或標簽指示器數組/稀疏矩陣,分類器返回的估計值。 5 # labels:array,shape = [n_labels],報表中包含的標簽索引的可選列表。 6 # target_names:字符串列表,與標簽匹配的可選顯示名稱(相同順序)。 7 # sample_weight:類似于shape = [n_samples]的數組,可選項,樣本權重。 8 # digits:int,輸出浮點值的位數.
1 # 使用SVC預測生存
2
3 y_pred = classifier.predict(X_test_pca)
4 cm = confusion_matrix(Y_test, y_pred)
5 print(cm)#預測真確和錯誤的個數
6 print('++++++++++++++++++++++++++++++++')
7 print(classification_report(Y_test, y_pred))
8
9 # 混淆矩陣(confusion_matrix)。
10
11 # TP(True Positive):將正類預測為正類數,真實為0,預測也為0
12 # FN(False Negative):將正類預測為負類數,真實為0,預測為1
13 # FP(False Positive):將負類預測為正類數, 真實為1,預測為0
14 # TN(True Negative):將負類預測為負類數,真實為1,預測也為1
15
16 # 精確率(precision)分母為預測為正樣例的個數,分子為預測為實際正樣例被預測準的個數
17 # 召回率(recall)分母為實際正樣例的個數,分子為預測為實際正樣例被預測準的個數
18 # F1-score混合的度量,對不平衡類別非常有效
19 # 準確率(accuracy)模型的整體的性能的評估
20 # Specificity分母為實際負樣例的個數,分子為預測為實際負樣例被預測準的個數
21 # 右邊support列為每個標簽的出現次數.avg / total行為各列的均值(support列為總和).
十一、使用 網格搜索 來提高模型
1 #1、GridSearchCV,它存在的意義就是自動調參,只要把參數輸進去,就能給出最優化的結果和參數。 2 # 但是這個方法適合于小數據集,一旦數據的量級上去了,很難得出結果 3 # 2、C: float參數 默認值為1.0 4 # 錯誤項的懲罰系數。C越大,即對分錯樣本的懲罰程度越大,因此在訓練樣本中準確率越高,但是泛化能力降低,也就是對測試數據的分類準確率 5 # 降低。相反,減小C的話,容許訓練樣本中有一些誤分類錯誤樣本,泛化能力強。對于訓練樣本帶有噪聲的情況,一般采用后者, 6 # 把訓練樣本集中錯誤分類的樣本作為噪聲。 7 # 3、gamma:float參數 默認為auto 8 9 # 核函數系數,只對‘rbf’,‘poly’,‘sigmod’有效。 10 11 # 如果gamma為auto,代表其值為樣本特征數的倒數,即1/n_features.
1 from sklearn.model_selection import GridSearchCV
2 param_grid = {'C':[0.1, 1, 10, 100], 'gamma':[1, 0.1, 0.01, 0.001]};
3 grid = GridSearchCV(SVC(),param_grid,refit=True,verbose = 2);
4 grid.fit(X_train_pca, Y_train);
5
6 # 預測
7 grid_predictions = grid.predict(X_test_pca);
8
9 # 分類報告
10 print(classification_report(Y_test,grid_predictions))
十二、可視化結果
1 ax = sns.boxplot(data = results) 2 ax.set_xticklabels(names) 3 4 # 通過盒圖,在分析數據的時候,盒圖能夠有效地幫助我們識別數據的特征: 5 # 直觀地識別數據集中的異常值(查看離群點)。 6 # 判斷數據集的數據離散程度和偏向(觀察盒子的長度,上下隔間的形狀,以及胡須的長度)。
十三、使用邏輯回歸預測
1 from sklearn.metrics import accuracy_score 2 from sklearn.metrics import classification_report 3 from sklearn.metrics import confusion_matrix 4 5 lr = LogisticRegression() # LR模型構建 6 lr.fit(X_train, Y_train) # 7 predictions = lr.predict(X_test) # 使用測試值預測 8 9 10 print(accuracy_score(Y_test, predictions)) # 打印評估指標(分類準確率) 11 print(classification_report(Y_test,predictions))
1 conf = confusion_matrix(Y_test, predictions) # 混淆矩陣 2 label = ["0","1"] # 3 sns.heatmap(conf, annot = True, xticklabels=label, yticklabels=label)
十四、補充
數據預處理方法
去除唯一屬性
唯一屬性通常是一些id屬性,這些屬性并不能刻畫樣本自身的分布規律,所以簡單地刪除這些屬性即可。缺失值處理的三種方法:
直接使用含有缺失值的特征;
刪除含有缺失值的特征(該方法在包含缺失值的屬性含有大量缺失值而僅僅包含極少量有效值時是有效的);
缺失值補全。
常見的缺失值補全方法:
(1)均值插補
如果樣本屬性的距離是可度量的,則使用該屬性有效值的平均值來插補缺失的值;
如果的距離是不可度量的,則使用該屬性有效值的眾數來插補缺失的值。如果使用眾數插補,出現數據傾斜會造成什么影響?
(2)同類均值插補
首先將樣本進行分類,然后以該類中樣本的均值來插補缺失值。
(3)建模預測
將缺失的屬性作為預測目標來預測,將數據集按照是否含有特定屬性的缺失值分為兩類,利用現有的機器學習算法對待預測數據集的缺失值進行預測。
該方法的根本的缺陷是如果其他屬性和缺失屬性無關,則預測的結果毫無意義;但是若預測結果相當準確,則說明這個缺失屬性是沒必要納入數據集中的;一般的情況是介于兩者之間。
(4)高維映射
將屬性映射到高維空間,采用獨熱碼編碼(one-hot)技術。將包含K個離散取值范圍的屬性值擴展為K+1個屬性值,若該屬性值缺失,則擴展后的第K+1個屬性值置為1。這種做法是最精確的做法,保留了所有的信息,也未添加任何額外信息,若預處理時把所有的變量都這樣處理,會大大增加數據的維度。這樣做的好處是完整保留了原始數據的全部信息、不用考慮缺失值;缺點是計算量大大提升,且只有在樣本量非常大的時候效果才好。
(5)多重插補(MultipleImputation,MI)
多重插補認為待插補的值是隨機的,實踐上通常是估計出待插補的值,再加上不同的噪聲,形成多組可選插補值,根據某種選擇依據,選取最合適的插補值。
(6)壓縮感知和矩陣補全
(7)手動插補
插補處理只是將未知值補以我們的主觀估計值,不一定完全符合客觀事實。在許多情況下,根據對所在領域的理解,手動對缺失值進行插補的效果會更好。
總結
以上是生活随笔為你收集整理的PimaIndiansdiabetes-数据预处理实验(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CRM Fiori Simulation
- 下一篇: CRM, C4C和SAP Hybris的