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