乙個資料集有時可能包含至少乙個靠近某個數字的特徵,但有時也會有一些相對來說存在極大值或者極小值的不平凡分布的的特徵。演算法對這種分布的資料會十分敏感,並且如果這種資料沒有能夠很好地規一化處理會使得演算法表現不佳。
對於高度傾斜分布的特徵如'capital-gain'
和'capital-loss'
,常見的做法是對資料施加乙個對數轉換,將資料轉換成對數,這樣非常大和非常小的值不會對學習演算法產生負面的影響。並且使用對數變換顯著降低了由於異常值所造成的資料範圍異常。但是在應用這個變換時必須小心:因為0的對數是沒有定義的,所以我們必須先將資料處理成乙個比0稍微大一點的數以成功完成對數轉換。
除了對於高度傾斜的特徵施加轉換,對數值特徵施加一些形式的縮放通常會是乙個好的習慣。在資料上面施加乙個縮放並不會改變資料分布的形式(比如上面說的'capital-gain' or 'capital-loss');但是,規一化保證了每乙個特徵在使用監督學習器的時候能夠被平等的對待。注意一旦使用了縮放,觀察資料的原始形式不再具有它本來的意義了,就像下面的例子展示的。
from sklearn.preprocessing import minmaxscaler
# 初始化乙個 scaler,並將它施加到特徵上
scaler = minmaxscaler()
numerical = ['age', 'education-num', 'capital-gain', 'capital-loss', 'hours-per-week']
features_raw[numerical] = scaler.fit_transform(data[numerical])
通常情況下,學習演算法期望輸入是數字的,這要求非數字的特徵(稱為類別變數)被轉換。轉換類別變數的一種流行的方法是使用獨熱編碼方案。獨熱編碼為每乙個非數字特徵的每乙個可能的類別建立乙個「虛擬」變數。例如,假設somefeature
有三個可能的取值a
,b
或者c
,。我們將把這個特徵編碼成somefeature_a
,somefeature_b
和somefeature_c
.
一些特徵
特徵_a
特徵_b
特徵_c0b
0101
c----> 獨熱編碼 ---->00
12a1
00使用pandas.get_dummies()
對資料來施加乙個獨熱編碼。
標籤編碼(label encoding)
le = sklearn.preprocessing.labelencoder()
le.fit([1, 2, 2, 6])
le.transform([1, 1, 2, 6]) #array([0, 0, 1, 2])
#非數值型轉化為數值型
le.fit(["paris", "paris", "tokyo", "amsterdam"])
le.transform(["tokyo", "tokyo", "paris"]) #array([2, 2, 1])
現在所有的
類別變數 已被轉換成數值特徵,而且所有的數值特徵已被規一化。和我們一般情況下做的一樣,我們現在將資料(包括特徵和它們的標籤)切分成訓練和測試集。其中80%的資料將用於訓練和20%的資料用於測試
from sklearn.model_selection import train_test_split
# 將'features'和'income'資料切分成訓練集和測試集
x_train, x_test, y_train, y_test = train_test_split(features, income, test_size = 0.2, random_state = 0)
假設使用準確率作為評價模型的標準是合適的。我們能夠使用f-beta score作為評價指標,這樣能夠同時考慮查準率和查全率:
fβ=(1+β2)⋅precision⋅recall(β2⋅precision)+recall
尤其是,當β=0.5
的時候更多的強調查準率,這叫做f
0.5 0
score(或者為了簡單叫做f-score)。
from sklearn.metrics import fbeta_score
fscore = fbeta_score(y_test, predictions_test, beta = 0.5)
模型調優
from sklearn.model_selection import gridsearchcv
from sklearn.metrics import make_scorer
# todo:初始化分類器
clf = sklearn.linear_model.logisticregression()
# todo:建立你希望調節的引數列表
parameters =
# todo:建立乙個fbeta_score打分物件
scorer = make_scorer(fbeta_score, beta=0.5)
# todo:在分類器上使用網格搜尋,使用'scorer'作為評價函式
grid_obj = gridsearchcv(clf, parameters,scorer)
# todo:用訓練資料擬合網格搜尋物件並找到最佳引數
grid_obj.fit(x_train, y_train)
# 得到estimator
best_clf = grid_obj.best_estimator_
# 使用沒有調優的模型做**
predictions = (clf.fit(x_train, y_train)).predict(x_test)
best_predictions = best_clf.predict(x_test)
# 匯報調參前和調參後的分數
print "unoptimized model\n------"
print "accuracy score on testing data: ".format(accuracy_score(y_test, predictions))
print "f-score on testing data: ".format(fbeta_score(y_test, predictions, beta = 0.5))
print "\noptimized model\n------"
print "final accuracy score on the testing data: ".format(accuracy_score(y_test, best_predictions))
print "final f-score on the testing data: ".format(fbeta_score(y_test, best_predictions, beta = 0.5))
機器學習 資料預處理
均值為0,標準差為1 from sklearn import preprocessing scaler preprocessing.standardscaler scaler.fit transform x 對原始資料進行線性變換,變換到 0,1 區間 也可以是其他固定最小最大值的區間 from s...
機器學習 資料預處理
1 連續資料特徵離散化的方法 由於lr 中模型表達能力有限,可以通過特徵離散化來提高非線性學習能力。主要方法 1 等距離散 取值範圍均勻劃分成n 等分,每份的間距相等。2 等頻離散 均勻分為n 等分,每份內包含的觀察點數相同 3 優化離散 3 1 卡方檢驗方法 統計樣本的實際觀測值與理論判斷值之間的...
機器學習筆記18 資料預處理2
為了能夠對資料集有乙個更好的理解,我們可以對資料集中的每乙個產品特徵構建乙個散布矩陣 scatter matrix 如果你發現你在上面嘗試 的特徵對於區分乙個特定的類別來說是必須的,那麼這個特徵和其它的特徵可能不會在下面的散射矩陣中顯示任何關係。相反的,如果你認為這個特徵對於識別乙個特定的類別是沒有...