來(lái)源:DA隨想隨筆
一、 概述
機(jī)器學(xué)習(xí)最基礎(chǔ)的5個(gè)流程,分別是數(shù)據(jù)獲取,數(shù)據(jù)預(yù)處理,特征工程,建模、測(cè)試和預(yù)測(cè),上線(xiàn)與部署。
如果用做菜來(lái)對(duì)比,數(shù)據(jù)獲取就好比買(mǎi)菜,數(shù)據(jù)預(yù)處理就好比洗菜,特征工程就好比主菜輔料加工準(zhǔn)備,建模就好比炒菜,上線(xiàn)部署就好比擺盤(pán)上菜。
由此可見(jiàn),數(shù)據(jù)預(yù)處理和特征工程在整個(gè)機(jī)器學(xué)習(xí)應(yīng)用工作中,占據(jù)了極其重要的地位。要是菜沒(méi)洗干凈,食材沒(méi)加工好,大廚手藝再高也做不出好吃的菜。
數(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ù)意義。
常見(jiàn)的需要處理的問(wèn)題有:
數(shù)據(jù)類(lèi)型問(wèn)題:數(shù)據(jù)中有的是文本格式,有的是數(shù)值格式,有的同樣是時(shí)間序列但是格式不同。
數(shù)據(jù)質(zhì)量問(wèn)題:數(shù)據(jù)存在重復(fù)值,異常值,缺失值,數(shù)據(jù)量綱不統(tǒng)一有的數(shù)據(jù)取值在(0,1)之間有的取值是百萬(wàn)級(jí)的,樣本分布存在偏態(tài)有某幾類(lèi)樣本量極大。
業(yè)務(wù)表達(dá)問(wèn)題:有些數(shù)據(jù)從值上看符合一般邏輯,但是落在具體業(yè)務(wù)場(chǎng)景中,就會(huì)存在問(wèn)題,因此要結(jié)合業(yè)務(wù)意義,剔除不符合要求的樣本數(shù)據(jù)。
特征工程
特征工程主要是對(duì)原始數(shù)據(jù)進(jìn)行加工、組合、轉(zhuǎn)換、產(chǎn)生新的變量,使其更能代表預(yù)測(cè)模型的潛在問(wèn)題。同時(shí)還可以通過(guò)特征工程,挑選和提取一些更有價(jià)值的特征,剔除一些對(duì)模型性能影響不大的特征,從而降低模型計(jì)算的復(fù)雜度。
特征工程的主要目的是降低模型計(jì)算成本,提高模型精度。
常見(jiàn)的需要處理的問(wèn)題有:
相關(guān)性分析:特征與特征之間相關(guān)性強(qiáng),說(shuō)明具有多重共線(xiàn)性,可以將幾個(gè)特征組合成一個(gè)新特征,實(shí)現(xiàn)降維;特征與目標(biāo)之間的相關(guān)性強(qiáng),說(shuō)明特征對(duì)目標(biāo)的解釋性好,是可用的特征,反之,說(shuō)明特征對(duì)目標(biāo)沒(méi)什么影響,則可以剔除該特征。
特征構(gòu)造:基于原始特征,進(jìn)行組合,轉(zhuǎn)換,加工,生成新的特征,使得其更具有對(duì)目標(biāo)的解釋性。
特征降維:講一些解釋性弱的特征,業(yè)務(wù)意義不強(qiáng)的特征剔除,降低模型運(yùn)算復(fù)雜度,提高性能。
二、 常用功能
接下來(lái)以python為例,介紹在數(shù)據(jù)預(yù)處理和特征工程過(guò)程中常用的一些方法。
# 導(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] # 異常值處理 # 異常值處理方式很多,如直接刪除或用均值替代等,其與缺失值處理方式基本一致,就不再額外贅述。
分類(lèi)變量編碼
讓不可計(jì)算的分類(lèi)變量轉(zhuǎn)化為可計(jì)算的數(shù)值或者矩陣
# label編碼,將分類(lèi)變量轉(zhuǎn)化成數(shù)值形式 from sklearn.preprocessing import LabelEncoder data_iris.iloc[:,-1] = LabelEncoder().fit_transform(data_iris.iloc[:,-1]) # onehot編碼,創(chuàng)建虛擬變量,將分類(lèi)變量轉(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) #類(lèi)為特征專(zhuān)用,所以不能使用一維數(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聚類(lèi)分箱 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ù)理解
通過(guò)數(shù)據(jù)預(yù)處理,數(shù)據(jù)邏輯上的錯(cuò)誤基本已經(jīng)消除。但這是否就代表著可以建模了呢?當(dāng)然不是,這里還需要對(duì)特征進(jìn)行處理。
如果說(shuō)數(shù)據(jù)預(yù)處理是對(duì)行數(shù)據(jù)進(jìn)行操作,那么特征工程主要是對(duì)列進(jìn)行操作。
而這其中,最重要的一步,是對(duì)特征的業(yè)務(wù)理解。如,某一個(gè)數(shù)據(jù)集有幾列分別為地區(qū),天氣,降水量,空氣濕度,用戶(hù)年齡。
如果現(xiàn)在是要對(duì)天氣情況進(jìn)行分析,那么很明顯,用戶(hù)年齡這個(gè)特征字段對(duì)這個(gè)目標(biāo)是沒(méi)有用處的。因此從業(yè)務(wù)理解的角度考慮,首先就可以剔除一些沒(méi)有錯(cuò),但沒(méi)有用的特征變量。
特征選擇-過(guò)濾法
# 方差過(guò)濾 ## 如果一個(gè)特征的方差很小,說(shuō)明數(shù)據(jù)都集中于一個(gè)范圍中,沒(méi)有什么差異性,甚至都是相同的值,該特征用處就不大 from sklearn.feature_selection import VarianceThreshold #獲取刪除不合格特征之后的新特征矩陣 X = VairanceThreshold().fit_transform(data_iris) # 相關(guān)性過(guò)濾 ## 如果特征與標(biāo)簽之間沒(méi)有相關(guān)性,則可以剔除該特征,如果特征與特征之間相關(guān)性很強(qiáng),則可以將特征組合,實(shí)現(xiàn)降維 ## 這里以卡方過(guò)濾為例,常見(jià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í)際需要取,也可以通過(guò)學(xué)習(xí)曲線(xiàn)取學(xué)習(xí)曲線(xiàn)中最高點(diǎn)對(duì)應(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ù)值,通過(guò)排序選擇有用的特征,這里沒(méi)有一個(gè)統(tǒng)一的標(biāo)準(zhǔn)去判斷權(quán)重參數(shù)達(dá)到什么標(biāo)準(zhǔn)可以剔除。且不同算法對(duì)參數(shù)讀取的函數(shù)也略有不同,因此對(duì)本方法就不具體舉例了。
特征選擇-包裝法
通過(guò)引入一個(gè)函數(shù),來(lái)幫助算法在模型訓(xùn)練時(shí)自主選擇特征,不需要人工判斷參數(shù)值。該方法相對(duì)復(fù)雜,本文也不做舉例。
三、 總結(jié)
本文簡(jiǎn)單介紹了數(shù)據(jù)分析過(guò)程中,數(shù)據(jù)預(yù)處理和特征工程的相關(guān)基礎(chǔ)內(nèi)容,并進(jìn)行了一些舉例。但其實(shí)這兩部分內(nèi)容遠(yuǎn)不是這么簡(jiǎn)單,在實(shí)際操作中,所遇到的問(wèn)題更加復(fù)雜,且可應(yīng)用的方法也非常多,本文所介紹的都是最基礎(chǔ)的方法,便于理解其用途。
可以說(shuō)數(shù)據(jù)分析結(jié)果好不好,很大程度取決于數(shù)據(jù)預(yù)處理和特征工程做的好不好。本文相對(duì)粗淺,感興趣的朋友,可以再深入研究。
審核編輯:湯梓紅
-
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8502瀏覽量
134589 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1224瀏覽量
25445 -
數(shù)據(jù)預(yù)處理
+關(guān)注
關(guān)注
1文章
20瀏覽量
2886
原文標(biāo)題:算法基礎(chǔ)-數(shù)據(jù)預(yù)處理和特征工程
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
轉(zhuǎn):Keil的使用方法 - 常用功能(二)
請(qǐng)問(wèn)預(yù)處理有哪些常用功能分別如何使用?
Python數(shù)據(jù)預(yù)處理方法
數(shù)據(jù)探索與數(shù)據(jù)預(yù)處理
c語(yǔ)言預(yù)處理命令以什么開(kāi)頭
數(shù)據(jù)預(yù)處理故障信息獲取
工業(yè)蒸汽量預(yù)測(cè)的數(shù)據(jù)預(yù)處理知識(shí)有哪些
機(jī)器學(xué)習(xí)的特征預(yù)處理問(wèn)題討論
特征工程與數(shù)據(jù)預(yù)處理全解析:基礎(chǔ)技術(shù)和代碼示例

評(píng)論