本文參考《數據科學家聯盟》餅乾文章。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、缺失值處理
對每一個字段都計算其缺失值比例,而後按照缺失比例和字段重要性,分別制定策略,可用下圖表示:
建議清洗每作一步都備份一下,或者在小規模數據上試驗成功再處理全量數據。
根據業務知識來進行人工填充。
將空值做爲一種特殊的屬性值來處理,它不一樣於其餘的任何屬性值。如全部的空值都用「unknown」填充。通常做爲臨時填充或中間過程。
df['Feature'].fillna('unknown', inplace=True)
若缺失率較低(小於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
在該方法中,用於求平均值/衆數/中位數並非從數據集的全部對象中取,而是從與該對象具備相同決策屬性值的對象中取得。
# 條件平均值填充 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')
使用待填充字段做爲Label,沒有缺失的數據做爲訓練數據,創建分類/迴歸模型,對待填充的缺失字段進行預測並進行填充。
先根據歐式距離或相關分析來肯定距離具備缺失數據樣本最近的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)
基於完整的數據集,創建迴歸方程。對於包含空值的對象,將已知屬性值代入方程來估計未知屬性值,以此估計值來進行填充。當變量不是線性相關時會致使有誤差的估計。經常使用線性迴歸。
若是某些指標很是重要又缺失率高,那就須要和取數人員或業務人員瞭解,是否有其餘渠道能夠取到相關數據。
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。二值化是對文本計數數據的常見操做,分析人員能夠決定僅考慮某種現象的存在與否。它還能夠用做考慮布爾隨機變量的估計器的預處理步驟(例如,使用貝葉斯設置中的伯努利分佈建模)。