python文本特征选择,机器学习--特征选择(Python实现)
特征選擇就是從原始特征中選取一些最有效的特征來降低維度,,提高模型泛化能力減低過擬合的過程,主要目的是剔除掉無關特征和冗余特征,選出最優特征子集;
常見的特征選擇方法可以分為3類:過濾式(filter)、包裹式(wrapper)、嵌入式(embedding)。
1.過濾式filter:
通過方差選擇法、相關系數法、卡方檢驗法、互信息法來對特征進行評分,設定閾值或者待選擇的閾值的個數來選擇;
1.1方差選擇法
計算各個特征的方差,剔除小于設定的閾值的特征,剔除特征值 波動較小的特征,例如一個特征的所有值都為1,那這個特征對于預測目標變量就沒什么作用;方法很簡單,但實際應用中只有少數變量才會存在只取某個值的情況,對特征選擇作用比較小,可以當做數據預處理部分,之后再用其他方法進行特征選擇。
from sklearn.feature_selection import VarianceThreshold
var = VarianceThreshold(threshold=0)
var.fit_transform(df)
df = df.iloc[var.get_support(True),:]
#VarianceThreshold返回已經提出方差為0的列,通過get_support[True]定位
剩余變量所在的列
1.2 單變量特征選擇
1.2.1相關系數法
皮爾森相關系數衡量的是變量之間的線性相關性,取值范圍在-1-+1之間,-1表示完全負相關,+1表示完全正相關,0表示線性無關;
可以使用scipy的pearsonr 計算皮爾森相關系數,且它還可以同時計算出p值
import numpy as np
from scipy.stats import pearsonr
x = np.random.normal(0,10,300)
y = x + np.random.normal(0,10,300)
pearsonr(x,y)
但是皮爾森相關系數只衡量線性關系,即使兩個變量之間有較強的非線性關系,皮爾森系數也有可能接近為0;
1.2.2.卡方檢驗法
檢驗定性自變量對定性因變量的相關性,卡方公式為:
其中Ai為觀測頻數,Ei為期望頻數
from sklearn.feature_selection import chi2
#chi2要求變量值非負,返回卡方值和P值
from sklearn.feature_selection import SelectKBest
from sklearn.datasets import load_iris
iris = load_iris()
model = SelectKBest(chi2, k=2)
model.fit_transform(iris.data,iris.target)
var = model.get_support(True)
1.2.3 互信息法和最大信息系數
互信息法也是評價定性自變量對定性因變量的相關性的,但是并不方便直接用于特征選擇,一是因為它不屬于度量方式,也沒有辦法進行歸一化,在不同的數據上的結果無法做比較;二是因為對于連續變量的計算不是很方便,通常需要將變量離散化,而互信息的結果對離散化的方法很敏感;
因此引入了最大信息系數 。最大信息系數首先尋找一種最優的離散方式,然后把互信息取值轉換成一種度量方式,取值區間在[0,1],minepy模塊提供了MIC(最大信息系數)方法:
x = np.random.normal(0,10,300)
z = x *x
pearsonr(x,z)
#計算得皮爾森系數= -0.1
from minepy import MINE
m = MINE()
m.compute_score(x, z)
print(m.mic())
#mic系數= 1.0
1.2.4 距離相關系數法
距離相關系數是為了克服皮爾森相關系數只能衡量線性關系的弱點而生的。x和x^2的皮爾森相關系數可能接近于0,但是這兩個變量并不是獨立不相關的。使用距離相關系數就可以計算x和x^2的非線性關系,如果距離相關系數接近于0,就可以說兩個變量之間是獨立的。R語言的energy包提供了距離相關系數的函數,Python沒有直接計算的包,可以查看https://gist.github.com/josef-pkt/2938402;
#R語言
x
z
dcor(x, z)
計算得 x,x**2的距離相關系數為0.98
2.包裹式Wrapper
根據預測效果(AUC/MSE)或者其他方法對特征組合進行評分,主要方法有遞歸特征消除法;
遞歸特征消除法的主要思想是反復的構建模型,然后選出最好或最壞的特征,把選出的特征放到一邊,然后在剩余的特征上重復這個過程,直到所有特征都遍歷了。在這個過程中特征被消除的次序就是特征的排序。
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
rfe = RFE(lr, n_features_to_select=2)
rfe.fit(iris.data, iris.target)
var = rfe.get_support(True)
3.嵌入式Embedded
3.1正則化
正則化主要包括L1正則化和L2正則化:
L1正則化將系數W的L1范數作為懲罰項加到損失函數中,L1正則方法具有稀疏解的特性,因此天然具有特征選擇的特性,但是不代表沒被選到的特征就不重要,有可能是因為兩個高度相關的特征最后只保留了一個;另外L1正則化和非正則化模型一樣是不穩定的,如果特征集合中具有相關聯的特征,當數據發生細微變化時也有可能導致很大的模型差異。
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x = scaler.fit_transform(iris.data)
y = iris.target
lasso = Lasso(alpha=0.2)
lasso.fit(x,y)
lasso.coef_
L2正則化將系數向量的L2范數添加到損失函數中,由于L2懲罰項中的系數是二次方的,會讓系數的取值變得平均,對于有相關性的變量,會得到相近的系數;L2正則化也較L1穩定;
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
iris = load_iris()
#看一下各變量之間的相關性
data = pd.DataFrame(iris.data)
data.corr()
可以看出2和3、0和2、3變量之間有較強的關聯性,然后看一下分別使用線性回歸、L1正則化和L2正則化后的變量系數:
scaler = StandardScaler()
x = scaler.fit_transform(iris.data)
y = iris.target
lr = LinearRegression()
lr.fit(x,y)
lr.coef_
lasso = Lasso(alpha=0.5)
lasso.fit(x,y)
lasso.coef_
ridge = Ridge(alpha=10)
ridge.fit(x,y)
ridge.coef_
可以看出L1正則化后容易得到一個稀疏矩陣,L2正則化后系數會趨于平均。
3.2樹模型
可以利用隨機森林或者GBDT模型進行特征選擇,之前我有一篇博文講的這個,這里不再詳細說明;上一篇隨機森林篩選變量的鏈接:https://mp.weixin.qq.com/s/6gc3H2y6SnOzdyx_L2WBwg
總結
以上是生活随笔為你收集整理的python文本特征选择,机器学习--特征选择(Python实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql乐观锁重试_乐观锁加重试,并发
- 下一篇: linux内存分配器类型,内核早期内存分