1、特征工程與意義
特征就是從數(shù)據(jù)中抽取出來(lái)的對(duì)結(jié)果預(yù)測(cè)有用的信息。
特征工程是使用專(zhuān)業(yè)知識(shí)背景知識(shí)和技巧處理數(shù)據(jù),是得特征能在機(jī)器學(xué)習(xí)算法上發(fā)揮更好的作用的過(guò)程。
2、基本數(shù)據(jù)處理
數(shù)據(jù)采集
- 需要思考那些數(shù)據(jù)有用
- 數(shù)據(jù)是否容易采集到
- 線(xiàn)上實(shí)時(shí)計(jì)算的時(shí)候獲取是否快捷
數(shù)據(jù)清洗
數(shù)據(jù)清洗做的事情:洗掉臟數(shù)據(jù)
思考角度:
1、單維度考量
身高3m的人?顯然不可能
一個(gè)月買(mǎi)臉盆墩布花了10w的人?也不太可能
組合或統(tǒng)計(jì)屬性判定
號(hào)稱(chēng)在美國(guó)但I(xiàn)P卻一直在大陸的新聞閱讀用戶(hù)?
要統(tǒng)計(jì)一個(gè)人是否會(huì)去買(mǎi)籃球鞋,然而你的樣本中女性占80%?
2、統(tǒng)計(jì)方法
使用箱線(xiàn)圖/boxplot上下界
取出缺省值多的字段
不可信的樣本要去掉,缺省值極多的字段考慮不用
數(shù)據(jù)采樣
分類(lèi)問(wèn)題中,很多情況下正負(fù)樣本是不均衡的。比如患某些疾病的患者和健康人。
大多數(shù)模型對(duì)正負(fù)樣本比是敏感的(如邏輯回歸LR)
解決方法:隨機(jī)采樣、分層采樣
如果是正樣本>>負(fù)樣本,而且量都很大:在正樣本下采樣。(如正樣本200萬(wàn)個(gè),負(fù)樣本20萬(wàn)個(gè),此時(shí)在正樣本中隨機(jī)采樣20萬(wàn)個(gè),正負(fù)樣本1:1構(gòu)建分類(lèi)器)
如果是正樣本>>負(fù)樣本,量不大:1、采集更多數(shù)據(jù);2、可以oversampling,即過(guò)采樣(如有10萬(wàn)正樣本,1000負(fù)樣本,最簡(jiǎn)單的方法是將1000負(fù)樣本多重復(fù)幾遍。然而這樣做可能會(huì)加大過(guò)擬合風(fēng)險(xiǎn),故會(huì)將負(fù)樣本經(jīng)過(guò)一些小的處理。如圖像識(shí)別里面判斷是否為貓,可將圖片旋轉(zhuǎn)?鏡像處理?加上一些噪聲?均可);3、修改損失函數(shù)。
3、常見(jiàn)特征工程
數(shù)值型
1、幅度調(diào)整/歸一化
- 幅度縮放Scaling
- 標(biāo)準(zhǔn)化Standardization
- 歸一化Normalization
2、將數(shù)值進(jìn)行Log等變化
3、統(tǒng)計(jì)值max、min、mean、std
4、離散化
對(duì)連續(xù)值可以將其離散化,按照一個(gè)區(qū)間來(lái)分(分箱、分桶)
下面代碼生成滿(mǎn)足標(biāo)準(zhǔn)高斯分布的20個(gè)隨機(jī)數(shù),使用pandas的cut函數(shù)可以將數(shù)據(jù)劃分。
import numpy as np import pandas as pd arr = np.random.randn(20) factor = pd.cut(arr,4) factor Out[5]: [(-0.643, 0.329], (0.329, 1.302], (-1.616, -0.643], (-1.616, -0.643], (-0.643, 0.329], ..., (-0.643, 0.329], (-0.643, 0.329], (-0.643, 0.329], (0.329, 1.302], (-1.616, -0.643]] Length: 20 Categories (4, interval[float64]): [(-2.593, -1.616] < (-1.616, -0.643] < (-0.643, 0.329] < (0.329, 1.302]]
5、高次與四則運(yùn)算特征
通過(guò)高次多項(xiàng)式或四則運(yùn)算來(lái)將數(shù)據(jù)升維。
6、數(shù)值轉(zhuǎn)為類(lèi)別
類(lèi)別型
1、one_hot編碼/啞變量
原數(shù)據(jù)
做one_hot編碼之后
注:不適合類(lèi)別特別多的字段
2、Hash技巧
如上圖,將文本型映射成向量
時(shí)間型
時(shí)間型數(shù)據(jù)既可以看成連續(xù)值,又可以看成離散值。
其他類(lèi)型
1、文本型
詞袋模型/bag of words
word2vec
文本數(shù)據(jù)預(yù)處理后,去掉停用詞,剩下的詞組成的list,在詞庫(kù)中的映射稀疏向量。
上述向量沒(méi)有加上詞的順序,可以將詞袋中的詞擴(kuò)充到n-gram。下圖即為將“Bi-grams are cool!”這句話(huà)映射成1個(gè)單詞和兩個(gè)單詞。
Tf-idf特征
Tf-idf是一種統(tǒng)計(jì)方法,用以評(píng)估一個(gè)字詞對(duì)于一個(gè)文件集或一個(gè)語(yǔ)料庫(kù)中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時(shí)會(huì)隨它在語(yǔ)料庫(kù)中出現(xiàn)的頻率成反比下降。
TF:Term Frequency
TF(t) = (詞t在當(dāng)前文中出現(xiàn)的次數(shù))/(t在全部語(yǔ)料庫(kù)中出現(xiàn)的次數(shù))
IDF:
IDF(t)=ln(總文檔數(shù)/含t的文檔數(shù))
TF-IDF權(quán)重 = TF(t)*IDF(t)
2、統(tǒng)計(jì)特征
加減平均
分位線(xiàn)
次序型
比例型
特征處理示例
4、特征選擇方法
特征選擇意義:
冗余:部分特征相關(guān)度太高了,消耗計(jì)算性能
噪聲:部分特征是對(duì)預(yù)測(cè)結(jié)果有負(fù)影響
特征選擇VS降維:
前者剔除原本特征里和結(jié)果預(yù)測(cè)關(guān)系不大的,后者做降維操作,但是保存大部分信息
SVD或PCA確實(shí)也能解決一定的高維問(wèn)題
過(guò)濾式特征選擇
評(píng)估單個(gè)特征和結(jié)果值之間的相關(guān)程度,排序留下Top相關(guān)的特征部分
Pearson系數(shù),互信息,距離相關(guān)度
缺點(diǎn):沒(méi)有考慮到特征之間的關(guān)聯(lián)作用,可能把有用的關(guān)聯(lián)特征誤剔除
相關(guān)的Python包:
#SelectKBest選擇排名前k個(gè)的特征 from sklearn.datasets import load_iris from sklearn.feature_selection import SelectKBest #chi2是卡方統(tǒng)計(jì)量 from sklearn.feature_selection import chi2 iris = load_iris() X,y = iris.data,iris.target # 之前的X數(shù)據(jù)集是有4個(gè)特征的 X.shape Out[13]: (150, 4) # 使用SelectKBest,使用卡方統(tǒng)計(jì)量,選出top2的兩個(gè)特征 X_new = SelectKBest(chi2,k=2).fit_transform(X,y) X_new.shape Out[15]: (150, 2)
包裹式(wrapper)特征選擇
把特征選擇看做一個(gè)特征子集搜索問(wèn)題,篩選出各種特征子集,用模型評(píng)估結(jié)果。
典型的包裹式算法為“遞歸特征刪除算法”(recusive feature elimination algorithm)
如用邏輯回歸,如何去做?
用全量跑一個(gè)模型
根據(jù)線(xiàn)性模型系數(shù)(體現(xiàn)相關(guān)性),刪掉5%-10%的特征,觀察準(zhǔn)確率/AUC的變化
逐步進(jìn)行,直至準(zhǔn)確率/AUC出現(xiàn)大的下滑停止
相關(guān)python包
幾個(gè)參數(shù)estimato為選擇的模型,n_features_to_select為迭代到最后幾個(gè)特征值。
from sklearn.feature_selection import RFE from sklearn.linear_model import LinearRegression from sklearn.datasets import load_boston boston = load_boston() lr= LinearRegression() rfe = RFE(lr,n_features_to_select=1) X = boston["data"] # 數(shù)據(jù)有13個(gè)特征 X.shape Out[27]: (506, 13) Y = boston["target"] names = boston["feature_names"] rfe.fit(X,Y) Out[28]: RFE(estimator=LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False), n_features_to_select=1, step=1, verbose=) # 使用遞歸特征刪除算法,將數(shù)據(jù)的13個(gè)特征排序,數(shù)字為對(duì)應(yīng)特征的序號(hào) rfe.ranking_ Out[29]: array([ 8, 10, 9, 3, 1, 2, 13, 5, 7, 11, 4, 12, 6])
嵌入式特征選擇
根據(jù)模型來(lái)分析特征的重要性(有別于上面的方式,是從生產(chǎn)的模型權(quán)重等)
最常見(jiàn)的方式為正則化方法來(lái)做特征選擇
一般用L1正則化來(lái)進(jìn)行特征選擇,用L2正則化來(lái)防止過(guò)擬合。
from sklearn.svm import LinearSVC from sklearn.datasets import load_iris from sklearn.feature_selection import SelectFromModel iris = load_iris() X,y = iris.data,iris.target # 之前的特征數(shù)為4 X.shape Out[6]: (150, 4) # 使用線(xiàn)性SVM分類(lèi)器,正則化選L1正則化 lsvc = LinearSVC(C=0.01,penalty='l1',dual=False).fit(X,y) model = SelectFromModel(lsvc,prefit=True) X_new = model.transform(X) # L1正則化后選擇的特征數(shù)為3 X_new.shape Out[10]: (150, 3)
評(píng)論
查看更多