过滤
单变量特征选择的目的是评估每个特征对模型预测能力的贡献。在选择用于单变量特征选择的模型时,应考虑以下因素:
-
模型的简单性:单变量特征选择通常用于初步筛选特征,因此选择的模型应该简单易懂,便于解释。线性回归模型是最常见的选择,因为它的参数可以直接解释为特征对目标变量的影响。
-
计算效率:由于需要对每个特征单独训练模型,因此选择的模型应该具有较高的计算效率,以便在有限的时间和资源内处理大量特征。
-
模型的适用性:选择的模型应该适用于数据的分布和问题类型。例如,如果数据是非线性的,可以考虑使用决策树或支持向量机等模型。
-
特征的评估指标:选择的模型应该能够提供明确的评估指标,如均方误差(MSE)或R-squared,以便比较不同特征的性能。
-
特征间的独立性:如果特征之间存在多重共线性,可能需要使用一些能够处理特征间关系的模型,如带有正则化的线性回归模型(Lasso或Ridge回归)。
基于上述考虑,以下是几种常用的模型,适用于单变量特征选择:
-
线性回归:适用于线性关系明显的数据,简单且易于解释。可以通过计算每个特征的系数来评估其重要性。
-
决策树:可以处理非线性关系,通过观察特征在树中的位置和重要性分数来评估特征的重要性。
-
支持向量机(SVM):适用于高维空间的数据,通过评估特征在支持向量中的权重来确定特征的重要性。
-
Lasso回归:通过L1正则化,可以将不重要的特征的系数压缩至零,从而实现特征选择。
-
随机森林:通过构建多个决策树并评估特征在所有树中的平均重要性,可以确定特征的重要性。
在选择模型时,还应考虑数据的特点和问题的具体需求。例如,如果数据集非常大,可能需要选择能够高效处理大数据集的模型。如果目标是解释模型的预测,可能更倾向于选择线性模型。最终,单变量特征选择的目的是为了找到最有影响力的特征,提高模型的预测性能和解释性。
特征选择ROC AUC分类(单变量特征选择)
导入需要的包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score,roc_auc_score
from sklearn.feature_selection import VarianceThreshold
加载数据
data = pd.read_csv('',nrows=2000)
data.head()
X = data.drop(['TARGEY'],axis=1)
y = data['TARGEY']
X.shape,y.shape
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=0,stratify=y)
删除常量,准常量,重复的特征
#删除常量,准常量,重复的特征
constant_filter = VarianceThreshold(threshold=0.01)
constant_filter.fit(x_train)
x_train_filter = constant_filter.transform(x_train)
x_test_filter = constant_filter.transform(x_test)
print(x_train_filter.shape,x_test_filter.shape)
#删除重复的特征
x_train_T = x_train_filter.T
x_test_T = x_test_filter.T
x_train_T = pd.DataFrame(x_train_T)
x_test_T = pd.DataFrame(x_test_T)
print(x_train_T.duplicated().sum())
duplicated_features = x_train_T.duplicated()
print(duplicated_features)
features_to_keep = [not index for index in duplicated_features]
x_train_unique = x_train_T[features_to_keep].T
x_test_unique = x_test_T[features_to_keep].T
print(x_train_unique.shape,x_train.shape)
计算ROC_AUC分数
#计算ROC_AUC分数
roc_auc = []
for feature in x_train_unique.columns:
clf = RandomForestClassifier(n_estimators=100,random_state=0)
clf.fit(x_train_unique[feature].to_frame,y_train)
y_pred = clf.predict(x_test_unique[feature].to_frame)
roc_auc.append(roc_auc_score(y_test,y_pred))
print(roc_auc)
roc_value = pd.Series(roc_auc)
roc_value.index = x_train_unique.columns
roc_value.sort_values(ascending= False,inplace=True)
print(roc_value)
#二份类问题中,如果roc_value小于0.5,则不能提供信息预测输出
roc_value.plot.bar()
sel = roc_value[roc_value>0.5]
print(sel)
x_train_roc = x_train_unique[sel.index]
x_test_roc = x_test_unique[sel.index]
建立模型和对比
#建立模型和对比
def run_randomForest(x_train,x_test,y_train,y_test):
clf = RandomForestClassifier(n_estimators=100, random_state=0)
clf.fit(x_train