目錄
- 1.數(shù)據(jù)預處理
- 1.1調(diào)整數(shù)據(jù)尺度
- 1.2正態(tài)化數(shù)據(jù)
- 1.3標準化數(shù)據(jù)
- 1.4二值數(shù)據(jù)
- 2.數(shù)據(jù)特征選定
- 2.1單變量特征選定
- 2.2遞歸特征消除
- 2.3數(shù)據(jù)降維
- 2.4特征重要性
- 總結
特征選擇時困難耗時的,也需要對需求的理解和專業(yè)知識的掌握。在機器學習的應用開發(fā)中,最基礎的是特征工程。
——吳恩達
1.數(shù)據(jù)預處理
數(shù)據(jù)預處理需要根據(jù)數(shù)據(jù)本身的特性進行,有缺失的要填補,有無效的要剔除,有冗余維的要刪除,這些步驟都和數(shù)據(jù)本身的特性緊密相關。
1.1調(diào)整數(shù)據(jù)尺度
如果數(shù)據(jù)的各個屬性按照不同的方式度量數(shù)據(jù),那么通過調(diào)整數(shù)據(jù)的尺度讓所有屬性按照相同的尺度來度量,就會給機器學習的算法模型訓練帶來極大的方便。
在scikit-learn中,可以通過Min Max Scalar類來調(diào)整數(shù)據(jù)尺度。將不同計量單位的數(shù)據(jù)統(tǒng)一成相同的尺度,利于對事物的分類或分組。Min Max Scalar其實是將屬性縮放到一個指定范圍,或者對數(shù)據(jù)進行標準化并將數(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ù)和輸出結果
array = data.values
X = array[:,0:8]
#X相當于所有數(shù)據(jù)
Y = array[:,8]
#Y為最后的class,即結果
transformer = MinMaxScaler(feature_range=(0,1)).fit(X)
#數(shù)據(jù)轉(zhuǎn)化
newX = transformer.fit_transform(X)
#設定數(shù)據(jù)的打印格式
set_printoptions(precision=3)
#設置精度
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ù)的手段,輸出結果以0為中位數(shù),方差為1。使用scikit-learn提供的Standard Scalar類來進行正態(tài)化處理。
transformer = StandardScaler().fit(X)
#數(shù)據(jù)轉(zhuǎn)換
_newX = transformer.transform(X)
#設定數(shù)據(jù)打印格式
set_printoptions(precision=3)
#設置精度
#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標準化數(shù)據(jù)
標準化數(shù)據(jù)是將每一行數(shù)據(jù)距離處理成1(在線性代數(shù)中矢量距離為1),又叫“歸一元”處理,適合處理稀疏數(shù)據(jù)(具有很多為0的數(shù)據(jù)),歸一元處理的數(shù)據(jù)對使用權重輸入的神經(jīng)網(wǎng)絡和使用距離的K近鄰算法的準確度的提升有顯著作用。
使用scikit-learn中的Normalizer類實現(xiàn)。
transformer = Normalizer().fit(X)
#數(shù)據(jù)轉(zhuǎn)換
__newX = transformer.transform(X)
#設置數(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)化為二值,大于閾值設置為1,小于閾值設置為0。
使用scikit-learn中的Binarizer類實現(xiàn)。
transformer = Binarizer(threshold=0.0).fit(X)
#數(shù)據(jù)轉(zhuǎn)換
newX_ = transformer.transform(X)
#設置數(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ù)的擬合度,提高算法精度,減少訓練時間。
2.1單變量特征選定
統(tǒng)計分析可以用來分析選擇對結果影響最大的數(shù)據(jù)特征。在scikit-learn中通過SelectKBest類來實現(xiàn),使用一系列統(tǒng)計方法來選定數(shù)據(jù)特征,也是對卡方檢驗的實現(xiàn)。
卡方值越大,實際觀測值與理論推斷值之間越不符合;卡方值越小,實際觀測值與理論推斷值之間越符合;若兩個值完全相等,卡方值為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]
#通過卡方檢驗選定數(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í)行后得到了卡方檢驗對每一個數(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)使用一個及模型來進行多輪訓練,每輪訓練后消除若干權值系數(shù)的特征,再基于新的特征集進行下一輪訓練。通過每一個基模型的精度,找到對最終預測結果影響最大的數(shù)據(jù)特征。
#遞歸特征消除
#特征選定
model = LogisticRegression(max_iter=3000)#需要手動設置最大迭代次數(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ù)進行降維處理,以利于對數(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特征重要性
使用袋裝決策樹算法、隨機森林算法和極端隨機樹算法可以計算數(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]
總結
本文主要講了機器學習中的數(shù)據(jù)準備工作,包括數(shù)據(jù)預處理和數(shù)據(jù)特征選定,這些都是為了后序優(yōu)化算法所做的準備工作。
到此這篇關于Python機器學習(三)數(shù)據(jù)準備的文章就介紹到這了,更多相關Python機器學習內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- python實現(xiàn)H2O中的隨機森林算法介紹及其項目實戰(zhàn)
- pyspark 隨機森林的實現(xiàn)
- python機器學習之隨機森林(七)
- Python機器學習利用隨機森林對特征重要性計算評估