簡單的數據預處理和特徵工程

本文參考《數據科學家聯盟》餅乾文章。html

1、無量綱化:最值歸一化、均值方差歸一化及sklearn中的Scaler算法

在量綱不一樣的狀況下,不能反映樣本中每個特徵的重要程度時,將須要使用歸一化方法。數組

通常來講解決方法爲把全部的數據都映射到同一個尺度(量綱)上。微信

一、經常使用的數據歸一化有兩種:dom

最值歸一化(normalization)機器學習

 把全部數據映射到0-1之間。最值歸一化的使用範圍是特徵的分佈具備明顯邊界的(分數0~100分、灰度0~255),受outlier的影響比較大學習

均值方差歸一化(standardization):測試

 把全部數據歸一到均值爲0方差爲1的分佈中。適用於數據中沒有明顯的邊界,有可能存在極端數據值的狀況.編碼

 

 

 二、sklearn中的Scalerspa

建模時要將數據集劃分爲訓練數據集&測試數據集。

訓練數據集進行歸一化處理,須要計算出訓練數據集的均值mean_train和方差std_train。

問題是:咱們在對測試數據集進行歸一化時,要計算測試數據的均值和方差麼?

答案是否認的。在對測試數據集進行歸一化時,仍然要使用訓練數據集的均值train_mean和方差std_train。這是由於測試數據是模擬的真實環境,真實環境中可能沒法獲得均值和方差,對數據進行歸一化。只可以使用公式(x_test - mean_train) / std_train而且,數據歸一化也是算法的一部分,針對後面全部的數據,也應該作一樣的處理.

所以咱們要保存訓練數據集中獲得的均值和方差。

在sklearn中專門的用來數據歸一化的方法:StandardScaler。

###下載數據集

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split

iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=666)

###歸一化
from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
# 歸一化的過程跟訓練模型同樣
standardScaler.fit(X_train)
standardScaler.mean_
standardScaler.scale_   # 表述數據分佈範圍的變量,替代std_

# 使用transform
X_train_standard = standardScaler.transform(X_train)
X_test_standard = standardScaler.transform(X_test)

 

2、缺失值處理

一、肯定缺失值範圍

對每一個字段都計算其缺失值比例,而後按照缺失比例和字段重要性,分別制定策略,可用下圖表示:

 

二、去除不須要的字段

建議清洗每作一步都備份一下,或者在小規模數據上試驗成功再處理全量數據。

三、填充缺失內容

1)人工填充(filling manually)

根據業務知識來進行人工填充。

2)特殊值填充(Treating Missing Attribute values as Special values)

將空值做爲一種特殊的屬性值來處理,它不一樣於其餘的任何屬性值。如全部的空值都用「unknown」填充。通常做爲臨時填充或中間過程。

df['Feature'].fillna('unknown', inplace=True)

3)統計量填充

若缺失率較低(小於95%)且重要性較低,則根據數據分佈的狀況進行填充。

經常使用填充統計量:
  • 平均值:

    對於數據符合均勻分佈,用該變量的均值填補缺失值。

  • 中位數:

    對於數據存在傾斜分佈的狀況,採用中位數填補缺失值。

  • 衆數:

    離散特徵可以使用衆數進行填充缺失值。

平均值填充法:

將初始數據集中的屬性分爲數值屬性和非數值屬性來分別進行處理。

# 以pandas庫操做爲例
display(df.head(10))
# 填充前數據
  Feature1    Feature2    Label
0    1.0           A          1
1    2.0           A          1
2    3.0           A          1
3    4.0           C          1
4    NaN        A          1
5    2.0           None          0
6    3.0           B          0
7    3.0           None          0
8    NaN           B          0
9    NaN        B          0

# 均值填充
df['Feature1'].fillna(df['Feature1'].mean(), inplace=True)

# 中位數填充
df['Feature2'].fillna(df['Feature2'].mode().iloc[0], inplace=True)

display(df.head(10))
# 填充後數據
    Feature1    Feature2    Label
0    1.000000    A            1
1    2.000000    A            1
2    3.000000    A            1
3    4.000000    C            1
4    2.571429    A            1
5    2.000000    A            0
6    3.000000    B            0
7    3.000000    A            0
8    2.571429    B            0
9    2.571429    B            0
條件平均值填充法(Conditional Mean Completer):

在該方法中,用於求平均值/衆數/中位數並非從數據集的全部對象中取,而是從與該對象具備相同決策屬性值的對象中取得。

# 條件平均值填充
def condition_mean_fillna(df, label_name, feature_name):
    mean_feature_name = '{}Mean'.format(feature_name)
    group_df = df.groupby(label_name).mean().reset_index().rename(columns={feature_name: mean_feature_name})

    df = pd.merge(df, group_df, on=label_name, how='left')
    df.loc[df[feature_name].isnull(), feature_name] = df.loc[df[feature_name].isnull(), mean_feature_name]
    df.drop(mean_feature_name, inplace=True, axis=1)
    return df

df = condition_mode_fillna(df, 'Label', 'Feature2')

4)模型預測填充

使用待填充字段做爲Label,沒有缺失的數據做爲訓練數據,創建分類/迴歸模型,對待填充的缺失字段進行預測並進行填充。

最近距離鄰法(KNN)

先根據歐式距離或相關分析來肯定距離具備缺失數據樣本最近的K個樣本,將這K個值加權平均/投票來估計該樣本的缺失數據。

from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor

def knn_missing_filled(x_train, y_train, test, k = 3, dispersed = True):
    '''
    @param x_train: 沒有缺失值的數據集
    @param y_train: 待填充缺失值字段
    @param test: 待填充缺失值數據集
    '''
    if dispersed:
        clf = KNeighborsClassifier(n_neighbors = k, weights = "distance")
    else:
        clf = KNeighborsRegressor(n_neighbors = k, weights = "distance")

    clf.fit(x_train, y_train)
    return test.index, clf.predict(test)
迴歸(Regression)

基於完整的數據集,創建迴歸方程。對於包含空值的對象,將已知屬性值代入方程來估計未知屬性值,以此估計值來進行填充。當變量不是線性相關時會致使有誤差的估計。經常使用線性迴歸。

4)從新取數

若是某些指標很是重要又缺失率高,那就須要和取數人員或業務人員瞭解,是否有其餘渠道能夠取到相關數據。

 

3、處理分類型特徵:編碼與啞變量

參考連接:https://www.cnblogs.com/juanjiang/archive/2019/05/30/10948849.html

在機器學習中,大多數算法,譬如邏輯迴歸,支持向量機SVM,k近鄰算法等都只可以處理數值型數據,不能處理文字,在sklearn當中,除了專用來處理文字的算法,其餘算法在fit的時候所有要求輸入數組或矩陣,也不可以導入文字型數據(其實手寫決策樹和普斯貝葉斯能夠處理文字,可是sklearn中規定必須導入數值型)。然而在現實中,許多標籤和特徵在數據收集完畢的時候,都不是以數字來表現的。好比說,學歷的取值能夠是["小學",「初中」,「高中」,"大學"],付費方式可能包含["支付寶",「現金」,「微信」]等等。在這種狀況下,爲了讓數據適應算法和庫,咱們必須將數據進行編碼,便是說,將文字型數據轉換爲數值型

 preprocessing.LabelEncoder:標籤專用,可以將分類轉換爲分類數值

preprocessing.OrdinalEncoder:特徵專用,可以將分類特徵轉換爲分類數值

preprocessing.OneHotEncoder:獨熱編碼,建立啞變量

 

4、處理連續型特徵:二值化與分段

  • sklearn.preprocessing.Binarizer

  根據閾值將數據二值化(將特徵值設置爲0或1),用於處理連續型變量。大於閾值的值映射爲1,而小於或等於閾值的值映射爲0。默認閾值爲0時,特徵中全部的正值都映射到1。二值化是對文本計數數據的常見操做,分析人員能夠決定僅考慮某種現象的存在與否。它還能夠用做考慮布爾隨機變量的估計器的預處理步驟(例如,使用貝葉斯設置中的伯努利分佈建模)。

相關文章
相關標籤/搜索