Python機(jī)器學(xué)習(xí)入門(三)之Python數(shù)據(jù)準(zhǔn)備
特征選擇時困難耗時的,也需要對需求的理解和專業(yè)知識的掌握。在機(jī)器學(xué)習(xí)的應(yīng)用開發(fā)中,最基礎(chǔ)的是特征工程。
——吳恩達(dá)
1.數(shù)據(jù)預(yù)處理
數(shù)據(jù)預(yù)處理需要根據(jù)數(shù)據(jù)本身的特性進(jìn)行,有缺失的要填補(bǔ),有無效的要剔除,有冗余維的要刪除,這些步驟都和數(shù)據(jù)本身的特性緊密相關(guān)。
1.1調(diào)整數(shù)據(jù)尺度
如果數(shù)據(jù)的各個屬性按照不同的方式度量數(shù)據(jù),那么通過調(diào)整數(shù)據(jù)的尺度讓所有屬性按照相同的尺度來度量,就會給機(jī)器學(xué)習(xí)的算法模型訓(xùn)練帶來極大的方便。
在scikit-learn中,可以通過Min Max Scalar類來調(diào)整數(shù)據(jù)尺度。將不同計(jì)量單位的數(shù)據(jù)統(tǒng)一成相同的尺度,利于對事物的分類或分組。Min Max Scalar其實(shí)是將屬性縮放到一個指定范圍,或者對數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化并將數(shù)據(jù)都聚集到0附近,方差為1。
from numpy import set_printoptions from pandas import read_csv from sklearn.preprocessing import MinMaxScaler filename = 'pima_data.csv' names = ['preg','plas','pres','skin','test','mass','pedi','age','class'] data = read_csv(filename,names = names) #將數(shù)據(jù)分為輸入數(shù)據(jù)和輸出結(jié)果 array = data.values X = array[:,0:8] #X相當(dāng)于所有數(shù)據(jù) Y = array[:,8] #Y為最后的class,即結(jié)果 transformer = MinMaxScaler(feature_range=(0,1)).fit(X) #數(shù)據(jù)轉(zhuǎn)化 newX = transformer.fit_transform(X) #設(shè)定數(shù)據(jù)的打印格式 set_printoptions(precision=3) #設(shè)置精度 print(newX)
[[0.353 0.744 0.59 ... 0.501 0.234 0.483]
[0.059 0.427 0.541 ... 0.396 0.117 0.167]
[0.471 0.92 0.525 ... 0.347 0.254 0.183]
...
[0.294 0.608 0.59 ... 0.39 0.071 0.15 ]
[0.059 0.633 0.492 ... 0.449 0.116 0.433]
[0.059 0.467 0.574 ... 0.453 0.101 0.033]]
1.2正態(tài)化數(shù)據(jù)
正態(tài)化數(shù)據(jù)是有效的處理符合高斯分布數(shù)據(jù)的手段,輸出結(jié)果以0為中位數(shù),方差為1。使用scikit-learn提供的Standard Scalar類來進(jìn)行正態(tài)化處理。
transformer = StandardScaler().fit(X) #數(shù)據(jù)轉(zhuǎn)換 _newX = transformer.transform(X) #設(shè)定數(shù)據(jù)打印格式 set_printoptions(precision=3) #設(shè)置精度 #print(_newX)
[[ 0.64 0.848 0.15 ... 0.204 0.468 1.426]
[-0.845 -1.123 -0.161 ... -0.684 -0.365 -0.191]
[ 1.234 1.944 -0.264 ... -1.103 0.604 -0.106]
...
[ 0.343 0.003 0.15 ... -0.735 -0.685 -0.276]
[-0.845 0.16 -0.471 ... -0.24 -0.371 1.171]
[-0.845 -0.873 0.046 ... -0.202 -0.474 -0.871]]
1.3標(biāo)準(zhǔn)化數(shù)據(jù)
標(biāo)準(zhǔn)化數(shù)據(jù)是將每一行數(shù)據(jù)距離處理成1(在線性代數(shù)中矢量距離為1),又叫“歸一元”處理,適合處理稀疏數(shù)據(jù)(具有很多為0的數(shù)據(jù)),歸一元處理的數(shù)據(jù)對使用權(quán)重輸入的神經(jīng)網(wǎng)絡(luò)和使用距離的K近鄰算法的準(zhǔn)確度的提升有顯著作用。
使用scikit-learn中的Normalizer類實(shí)現(xiàn)。
transformer = Normalizer().fit(X) #數(shù)據(jù)轉(zhuǎn)換 __newX = transformer.transform(X) #設(shè)置數(shù)據(jù)打印格式 set_printoptions(precision=3) print(__newX)
[[0.034 0.828 0.403 ... 0.188 0.004 0.28 ]
[0.008 0.716 0.556 ... 0.224 0.003 0.261]
[0.04 0.924 0.323 ... 0.118 0.003 0.162]
...
[0.027 0.651 0.388 ... 0.141 0.001 0.161]
[0.007 0.838 0.399 ... 0.2 0.002 0.313]
[0.008 0.736 0.554 ... 0.241 0.002 0.182]]
1.4二值數(shù)據(jù)
二值數(shù)據(jù)是使用值將數(shù)據(jù)轉(zhuǎn)化為二值,大于閾值設(shè)置為1,小于閾值設(shè)置為0。
使用scikit-learn中的Binarizer類實(shí)現(xiàn)。
transformer = Binarizer(threshold=0.0).fit(X) #數(shù)據(jù)轉(zhuǎn)換 newX_ = transformer.transform(X) #設(shè)置數(shù)據(jù)打印格式 set_printoptions(precision=3) print(newX_)
[[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. 1. 1. ... 1. 1. 1.]
[1. 1. 1. ... 1. 1. 1.]]
2.數(shù)據(jù)特征選定
在開始建立模型之前,執(zhí)行特征選定有助于:降低數(shù)據(jù)的擬合度,提高算法精度,減少訓(xùn)練時間。
2.1單變量特征選定
統(tǒng)計(jì)分析可以用來分析選擇對結(jié)果影響最大的數(shù)據(jù)特征。在scikit-learn中通過SelectKBest類來實(shí)現(xiàn),使用一系列統(tǒng)計(jì)方法來選定數(shù)據(jù)特征,也是對卡方檢驗(yàn)的實(shí)現(xiàn)。
卡方值越大,實(shí)際觀測值與理論推斷值之間越不符合;卡方值越小,實(shí)際觀測值與理論推斷值之間越符合;若兩個值完全相等,卡方值為0。
from pandas import read_csv from numpy import set_printoptions from sklearn.feature_selection import chi2 from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegression from sklearn.decomposition import PCA from sklearn.ensemble import ExtraTreesClassifier filename = 'pima_data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] data = read_csv(filename, names=names) array = data.values X = array[:,0:8] Y = array[:,8] #通過卡方檢驗(yàn)選定數(shù)據(jù)特征 #特征選定 test = SelectKBest(score_func=chi2,k=4) fit = test.fit(X,Y) set_printoptions(precision=3) print(fit.scores_) features = fit.transform(X) print(features)
執(zhí)行后得到了卡方檢驗(yàn)對每一個數(shù)據(jù)特征的評分,以及得分最高的四個數(shù)據(jù)特征。[ 111.52 1411.887 17.605 53.108 2175.565 127.669 5.393 181.304]
[[148. 0. 33.6 50. ]
[ 85. 0. 26.6 31. ]
[183. 0. 23.3 32. ]
...
[121. 112. 26.2 30. ]
[126. 0. 30.1 47. ]
[ 93. 0. 30.4 23. ]]
2.2遞歸特征消除
遞歸特征消除(RFE)使用一個及模型來進(jìn)行多輪訓(xùn)練,每輪訓(xùn)練后消除若干權(quán)值系數(shù)的特征,再基于新的特征集進(jìn)行下一輪訓(xùn)練。通過每一個基模型的精度,找到對最終預(yù)測結(jié)果影響最大的數(shù)據(jù)特征。
#遞歸特征消除 #特征選定 model = LogisticRegression(max_iter=3000)#需要手動設(shè)置最大迭代次數(shù) rfe = RFE(model,3) fit = rfe.fit(X,Y) print("特征個數(shù):") print(fit.n_features_) print("被選定的特征:") print(fit.support_) print("特征排名:") print(fit.ranking_)
特征個數(shù):
3
被選定的特征:
[ True False False False False True True False]
特征排名:
[1 2 4 6 5 1 1 3]
2.3數(shù)據(jù)降維
常見降維方法有PCA(主要成分分析)和LDA(線性判別分析)。在聚類算法中,通常會用PCA對數(shù)據(jù)進(jìn)行降維處理,以利于對數(shù)據(jù)的簡化分析和可視化。
#主要成分分析(數(shù)據(jù)降維) #通過主要成分分析選定數(shù)據(jù)特征 pca = PCA(n_components=3) fit = pca.fit(X) print("解釋方差:%s"% fit.explained_variance_ratio_) print(fit.components_)
解釋方差:[0.889 0.062 0.026]
[[-2.022e-03 9.781e-02 1.609e-02 6.076e-02 9.931e-01 1.401e-02
5.372e-04 -3.565e-03]
[-2.265e-02 -9.722e-01 -1.419e-01 5.786e-02 9.463e-02 -4.697e-02
-8.168e-04 -1.402e-01]
[-2.246e-02 1.434e-01 -9.225e-01 -3.070e-01 2.098e-02 -1.324e-01
-6.400e-04 -1.255e-01]]
2.4特征重要性
使用袋裝決策樹算法、隨機(jī)森林算法和極端隨機(jī)樹算法可以計(jì)算數(shù)據(jù)特征的重要性。
#特征重要性 #特征選定 model = ExtraTreesClassifier() fit = model.fit(X,Y) print(fit.feature_importances_)
[0.109 0.234 0.101 0.077 0.076 0.14 0.121 0.142]
總結(jié)
本文主要講了機(jī)器學(xué)習(xí)中的數(shù)據(jù)準(zhǔn)備工作,包括數(shù)據(jù)預(yù)處理和數(shù)據(jù)特征選定,這些都是為了后序優(yōu)化算法所做的準(zhǔn)備工作。
到此這篇關(guān)于Python機(jī)器學(xué)習(xí)(三)數(shù)據(jù)準(zhǔn)備的文章就介紹到這了,更多相關(guān)Python機(jī)器學(xué)習(xí)內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。