來源:DA隨想隨筆
一、 概述
機器學習最基礎的5個流程,分別是數據獲取,數據預處理,特征工程,建模、測試和預測,上線與部署。
如果用做菜來對比,數據獲取就好比買菜,數據預處理就好比洗菜,特征工程就好比主菜輔料加工準備,建模就好比炒菜,上線部署就好比擺盤上菜。
由此可見,數據預處理和特征工程在整個機器學習應用工作中,占據了極其重要的地位。要是菜沒洗干凈,食材沒加工好,大廚手藝再高也做不出好吃的菜。
數據預處理
數據預處理主要是從數據角度和業務角度兩方面入手,從獲取的數據中查缺補漏,修正不準確的數據,剔除不適用的數據。
數據預處理的主要目的就是讓數據符合模型需求,能正確表達業務意義。
常見的需要處理的問題有:
數據類型問題:數據中有的是文本格式,有的是數值格式,有的同樣是時間序列但是格式不同。
數據質量問題:數據存在重復值,異常值,缺失值,數據量綱不統一有的數據取值在(0,1)之間有的取值是百萬級的,樣本分布存在偏態有某幾類樣本量極大。
業務表達問題:有些數據從值上看符合一般邏輯,但是落在具體業務場景中,就會存在問題,因此要結合業務意義,剔除不符合要求的樣本數據。
特征工程
特征工程主要是對原始數據進行加工、組合、轉換、產生新的變量,使其更能代表預測模型的潛在問題。同時還可以通過特征工程,挑選和提取一些更有價值的特征,剔除一些對模型性能影響不大的特征,從而降低模型計算的復雜度。
特征工程的主要目的是降低模型計算成本,提高模型精度。
常見的需要處理的問題有:
相關性分析:特征與特征之間相關性強,說明具有多重共線性,可以將幾個特征組合成一個新特征,實現降維;特征與目標之間的相關性強,說明特征對目標的解釋性好,是可用的特征,反之,說明特征對目標沒什么影響,則可以剔除該特征。
特征構造:基于原始特征,進行組合,轉換,加工,生成新的特征,使得其更具有對目標的解釋性。
特征降維:講一些解釋性弱的特征,業務意義不強的特征剔除,降低模型運算復雜度,提高性能。
二、 常用功能
接下來以python為例,介紹在數據預處理和特征工程過程中常用的一些方法。
# 導入數據,這里以python自帶的鳶尾花數據為例 from sklearn import datasets import pandas as pd import numpy as np # 加載數據集 data = datasets.load_iris() X = data.data # 特征值 y = data.target # 目標值 data_iris=pd.DataFrame(X) data_iris['target']=pd.DataFrame(y) data_iris=data_iris.rename(columns={0:'F1',1:'F2',2:'F3',3:'F4','target':'target'}) data_iris.head()
數據預處理
重復值處理
# 重復值刪除 data_iris = data_iris.drop_duplicates()
缺失值處理
# 缺失值處理 ## 查看缺失值 data_iris.isnull().sum() ## 缺失值刪除 ### 刪除含有缺失值的行 data_iris = data_iris.dropna() ### 刪除含有缺失值的列 data_iris = data_iris.dropna(axis=1) ##缺失值填補 ### 用指定數值填充缺失值 ,如0 data_iris = data_iris.fillna(0) ### 用均值、中位數、眾數填補 data_iris = data_iris.fillna(data_iris.mean())
異常值處理
# 異常值識別 ## 分位數識別異常值,將上下四分位數之外的都定義為異常值 from scipy import stats ### 計算IQR Q1 = data_iris.quantile(0.25) Q3 = data_iris.quantile(0.75) IQR = Q3 - Q1 ### 找出異常值 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR outliers = data_iris[(data_iris < lower_bound) | (data_iris > upper_bound)] ## 標準差識別異常值,在幾個標準差之外的數據定義為異常值 z_scores = (data_iris - data_iris.mean()) / data_iris.std() outliers_z = z_scores[abs(z_scores) > 3] # 異常值處理 # 異常值處理方式很多,如直接刪除或用均值替代等,其與缺失值處理方式基本一致,就不再額外贅述。
分類變量編碼
讓不可計算的分類變量轉化為可計算的數值或者矩陣
# label編碼,將分類變量轉化成數值形式 from sklearn.preprocessing import LabelEncoder data_iris.iloc[:,-1] = LabelEncoder().fit_transform(data_iris.iloc[:,-1]) # onehot編碼,創建虛擬變量,將分類變量轉化成01矩陣 from sklearn.preprocessing import OneHotEncoder X = data_iris.iloc[:,1:-1] enc = OneHotEncoder(categories='auto').fit(X) result = enc.transform(X).toarray()
連續變量編碼
將連續變量離散化,使得其可以根據有區分效果。
# 二值化,大于閾值記為1,小于閾值記為0 from sklearn.preprocessing import Binarizer X = data_iris.iloc[:,0].values.reshape(-1,1) #類為特征專用,所以不能使用一維數組 transformer = Binarizer(threshold=30).fit_transform(X) #transformer # 分箱 from sklearn.preprocessing import KBinsDiscretizer X = data_iris.iloc[:,0].values.reshape(-1,1) # n_bins設置要分幾箱,默認為5;encode設置編碼方式,默認onehot; # strategy設置分箱方法,默認為quantile等位分箱(每箱樣本數量相同),uniform等寬分箱,每個箱的上下限差值相同,kmeans聚類分箱 est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform') est.fit_transform(X) #查看轉換后分的箱:變成了一列中的三箱 set(est.fit_transform(X).ravel()) est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')#查看轉換后分的箱:變成了啞變量 est.fit_transform(X).toarray()
標準化
消除變量的量綱,使得特征變量的值都收斂于同一個范圍。
# maxmin標準化 from sklearn.preprocessing import MinMaxScaler #實現歸一化 scaler = MinMaxScaler() scaler = scaler.fit(data_iris) result = scaler.transform(data_iris) # z標準化 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaler = scaler.fit(data_iris) result = scaler.transform(data_iris)
特征工程
業務理解
通過數據預處理,數據邏輯上的錯誤基本已經消除。但這是否就代表著可以建模了呢?當然不是,這里還需要對特征進行處理。
如果說數據預處理是對行數據進行操作,那么特征工程主要是對列進行操作。
而這其中,最重要的一步,是對特征的業務理解。如,某一個數據集有幾列分別為地區,天氣,降水量,空氣濕度,用戶年齡。
如果現在是要對天氣情況進行分析,那么很明顯,用戶年齡這個特征字段對這個目標是沒有用處的。因此從業務理解的角度考慮,首先就可以剔除一些沒有錯,但沒有用的特征變量。
特征選擇-過濾法
# 方差過濾 ## 如果一個特征的方差很小,說明數據都集中于一個范圍中,沒有什么差異性,甚至都是相同的值,該特征用處就不大 from sklearn.feature_selection import VarianceThreshold #獲取刪除不合格特征之后的新特征矩陣 X = VairanceThreshold().fit_transform(data_iris) # 相關性過濾 ## 如果特征與標簽之間沒有相關性,則可以剔除該特征,如果特征與特征之間相關性很強,則可以將特征組合,實現降維 ## 這里以卡方過濾為例,常見的還有F檢驗,互信息等 from sklearn.ensemble import RandomForestClassifier as RFC from sklearn.model_selection import cross_val_score from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import chi2 # k表示需要保留的特征個數 X_kafang = SelectKBest(chi2, k=3).fit_transform(data_iris.iloc[:,:-1], data_iris['target']) ## 至于k怎么取值,一方面是可以根據業務實際需要取,也可以通過學習曲線取學習曲線中最高點對應的k值 %matplotlib inline import matplotlib.pyplot as plt score = [] for i in range(3,0,-1): X_fschi = SelectKBest(chi2, k=i).fit_transform(data_iris.iloc[:,:-1], data_iris['target']) once = cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,data_iris['target'],cv=5).mean() score.append(once) plt.plot(range(3,0,-1),score) plt.show()
特征選擇-嵌入法
將特征嵌入模型,讓算法同時進行特征選擇和模型訓練,然后輸出特征的權重參數值,通過排序選擇有用的特征,這里沒有一個統一的標準去判斷權重參數達到什么標準可以剔除。且不同算法對參數讀取的函數也略有不同,因此對本方法就不具體舉例了。
特征選擇-包裝法
通過引入一個函數,來幫助算法在模型訓練時自主選擇特征,不需要人工判斷參數值。該方法相對復雜,本文也不做舉例。
三、 總結
本文簡單介紹了數據分析過程中,數據預處理和特征工程的相關基礎內容,并進行了一些舉例。但其實這兩部分內容遠不是這么簡單,在實際操作中,所遇到的問題更加復雜,且可應用的方法也非常多,本文所介紹的都是最基礎的方法,便于理解其用途。
可以說數據分析結果好不好,很大程度取決于數據預處理和特征工程做的好不好。本文相對粗淺,感興趣的朋友,可以再深入研究。
審核編輯:湯梓紅
-
機器學習
+關注
關注
66文章
8438瀏覽量
133080 -
數據集
+關注
關注
4文章
1209瀏覽量
24830 -
數據預處理
+關注
關注
1文章
20瀏覽量
2800
原文標題:算法基礎-數據預處理和特征工程
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論