基于pandas,对DataFrame类型数据data的因素列feature_column,目标列target_column提取n_components维特征。
1.1 特征选择
1.1.1 低方差滤波器
例一:
def LowVarianceFilter(data,feature_column,n_components=-1):
df=data[feature_column]
#归一化
df=df.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x)))
var=df.var()#/np.mean(df)
sort_var=sorted(enumerate(var),key=lambda x:x[1],reverse=True)
cols=[feature_column[it[0]] for it in sort_var][:n_components]
return cols
例二:
#使用VarianceThreshold类进行方差过滤
from sklearn.feature_selection import VarianceThreshold
def LowVarianceFilter2(data,feature_column,score_column,n_components=-1):
#要生成这个类的对象,就需要一个参数,就是最小方差的阈值,我们先设置为1,然后调用它的transform方法进行特征值的过滤
variancethreshold=VarianceThreshold(threshold=300)
variancethreshold.fit_transform(data[feature_column],data[score_column])
#使用get_support方法,可以得到选择特征列的序号,然后根据这个序号在原始数据中把对应的列名选择出来即可
cols=feature_column[variancethreshold.get_support()].tolist()
return cols
1.1.2 高相关性滤波器
#高相关滤波(High Correlation filter),过滤指标,传入数据喝需要计算的列,如果两个变量之间是高度相关的,这意味着它们具有相似的趋势并且可能携带类似的信息。
def HighCorrelationFilter(data,feature_column,n_components=-1):
#计算每个指标的方差
corr = data.loc[:, feature_column].corr()
corr=corr**2
cor_dict={
}
for it in feature_column:
cor_dict[it]=0
for i in index_column:
for j in index_column:
cor_dict[i]+=corr[i][j]
sort_cor= sorted(cor_dict.items(),key=lambda x:x[1],reverse=False)[:n_components]
cols=[it[0] for it in sort_cor]
return cols
1.1.3 相关系数法
先计算各个特征对目标值的相关系数,选择更加相关的特征。
#SelectKBest类,通过回归的方法,以及要选择多少个特征值,新建一个 SelectKBest对象,
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_regression
def SelectBestFeature(data,feature_column,score_column,n_components=-1):
if n_components==-1:
n_components=len(feature_column)
selectKBest = SelectKBest(
f_regression,k=n_components
)
#接着,把自变量选择出来,然后调用fit_transform方法,把自变量和因变量传入,即可选出相关度最高的变量。
bestFeature =selectKBest.fit_transform(
data[feature_column],
data[score_column]
)
#我们想要知道选出的自变量的名字,使用get_support方法即可得到相应的列名
cols=feature_column[selectKBest.get_support()].tolist()
return cols
1.1.4 模型选择法
例一:
随机森林是一个广泛使用的特征选择算法,该算法可以计算出每个特征变量的重要性,从而我们可以舍弃重要性低的变量达到将为的目的。
from sklearn.ensemble import RandomForestRegressor
from sklearn.feature_selection import SelectFromModel
def GetFeatureByRandomForest(data,feature_column,score_column,n_components=-1):
model = RandomForestRegressor(random_state=1, max_depth=10)
model.fit(data[feature_column],data[score_column])
#plot the feature importance graph
importances = model.feature_importances_
indices = np.argsort(importances)
plt.title('Feature Importances')
plt.barh(range(len(indices)), importances[indices], color='b', align='center')
plt.yticks(range(len(indices)), [feature_column[i] for i in indices])
plt.xlabel('Relative Importance')
plt.show()
# use the SelectFromModel to selects the features
feature = SelectFromModel(model)
fit = feature.fit_transform(data[feature_column],data[score_column])
column_num = fit.shape[1]
#np.argsort(x) #按升序排列 np.argsort(-x) #按降序排列 取索引
indices = np.argsort(