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