特征选择总结、代码实现!
什么是特征选择? 说出特性选择的一些好处 你知道哪些特征选择技巧? 区分单变量、双变量和多变量分析。 我们能用PCA来进行特征选择吗? 前向特征选择和后向特征选择的区别是什么?
01 什么是特征选择,为何重要?
它有助于减少数据集的大小和复杂性,并且可以使用更少的时间来训练模型及进行推理; 具有较少特征的简单机器学习模型更容易理解和解释; 它可以避免过度拟合。更多特征使模型变得更加复杂,并带来维度灾难(误差随着特征数量的增加而增加)。
02 特征选择方法有哪些?
Filtered-based基于过滤的方法:这种方法是最直接的,这种特征的选择独立于任何机器学习算法。使用统计数据(例如 Pearson 相关系数、LDA 等),根据每个特征如何影响目标结果来选择重要特征。这是计算密集度最低且速度最快的方法。 Wrapper 基于包装器方法:这种方法根据 ML 训练指标结果选择特征。每个子集在训练后得到一个分数,然后添加或删除特征,并在最终在达到所需的 ML 指标阈值时停止,这种方法可以是前向、后向或递归的。这是计算最密集的方法,因为需要训练许多 ML 模型,并且逐一进行判断选择。 Embedded 基于嵌入的方法:这种方法更加复杂,它将上面两种方法组合在一起。这种方法最流行的例子是 LASSO 和树型算法。
03 使用Python进行特征选择
%matplotlib inline
from matplotlib import pyplot as plt
pd.set_option('display.float_format', lambda x: '%.0f' % x)
loan = pd.read_csv('../input/lending-club/accepted_2007_to_2018Q4.csv.gz', compression='gzip', low_memory=True)
loan.info
loans = loan[['id', 'loan_amnt', 'term','int_rate', 'sub_grade', 'emp_length','grade', 'annual_inc', 'loan_status', 'dti', 'mths_since_recent_inq', 'revol_util', 'bc_open_to_buy', 'bc_util', 'num_op_rev_tl']] #remove missing values
loans = loans.dropna()
loan_amnt -借款人申请贷款的清单金额。 term -偿还贷款的次数,其中的值以月为单位,可以是36或60。 int_rate -贷款的利率 sub_grade -根据借款人的信用记录分配贷款等级分数 emp_length -借款者的就业年限。 home_ownership-借款人提供的房屋所有权状况(例如,租金、所有权、抵押贷款等) annual_inc -借款人提供的自我报告的年收入 addr_state-借款人在贷款申请中提供的状态 dti -用借款人每月偿还的债务总额(不包括按揭)除以借款人每月收入计算的比率。 mths_since_recent_inq-最近一次查询的月份 revol_util - 循环额度利用率,或借款人使用的信贷金额相对于所有可用的循环信贷。 bc_open_to_buy - 银行卡的总开放购买量 bc_util - 所有银行卡账户的总流动余额与高信用/信用限额的比率 num_op_rev_tl - 开户数 loan_status - 当前贷款状态(例如,完全支付或注销)。这就是我们要用模型预测的标签。
loans = loans.dropna() q_low = loans["annual_inc"].quantile(0.08)
q_hi = loans["annual_inc"].quantile(0.92) loans = loans[(loans["annual_inc"] < q_hi) & (loans["annual_inc"] > q_low)]
loans = loans[(loans['dti'] <=45)]
q_hi = loans['bc_open_to_buy'].quantile(0.95)
loans = loans[(loans['bc_open_to_buy'] < q_hi)]
loans = loans[(loans['bc_util'] <=160)]
loans = loans[(loans['revol_util'] <=150)]
loans = loans[(loans['num_op_rev_tl'] <=35)]cleaner_app_type = {"term": {" 36 months": 1.0, " 60 months": 2.0},
"sub_grade": {"A1": 1.0, "A2": 2.0, "A3": 3.0, "A4": 4.0,
"A5": 5.0, "B1": 11.0, "B2": 12.0, "B3": 13.0, "B4": 14.0,
"B5": 15.0, "C1": 21.0, "C2": 22.0, "C3": 23.0, "C4":
24.0, "C5": 25.0, "D1": 31.0, "D2": 32.0, "D3": 33.0,
"D4": 34.0, "D5": 35.0, "E1": 41.0, "E2": 42.0, "E3":
43.0, "E4": 44.0, "E5": 45.0, "F1": 51.0, "F2": 52.0,
"F3": 53.0, "F4": 54.0, "F5": 55.0, "G1": 61.0, "G2":
62.0, "G3": 63.0, "G4": 64.0, "G5": 65.0, },
"emp_length": {"< 1 year": 0.0, '1 year': 1.0, '2 years': 2.0,
'3 years': 3.0, '4 years': 4.0, '5 years': 5.0, '6 years':
6.0, '7 years': 7.0, '8 years': 8.0, '9 years': 9.0, '10+
years': 10.0 }
}
loans = loans.replace(cleaner_app_type)
1)删除低方差(超过90%)的特征;
2)删除有大量缺失值的特征。
1)性别只包含一个性别值(例如,女性)
2)年龄包含30到50岁之间的不同值
在这种情况下,性别特征的方差很小,因为这个属性中的值都是相同的,在模型训练时,它不会帮助模型找到任何模式;因此我们可以直接删除这个特征。
from sklearn.feature_selection import VarianceThreshold
variance = VarianceThreshold(threshold = (.9 * (1 - .9)))
variance.fit(loans)
variance.get_support()
第二步:识别高度相关的特征
一个或多个变量依赖于另一个变量,可能导致多重共线性; 相关性可以帮助预测一个变量与另一个变量的关系,表明存在因果关系; 在业务层面上可以了解标签结果的因素,在我们的例子中了解每个特性如何影响贷款支付结果
第三步:处理多重共线性
from pandas_profiling import ProfileReport
profile = ProfileReport (loans, title = 'Loans Defaults Prediction', html = {'style': {'full_width': True }})
profile
零相关表示变量之间没有关系; 相关性为-1表示完全负相关,这意味着当一个变量上升时,另一个变量下降; 相关性为+1表示完全正相关,这意味着两个变量一起朝同一个方向移动。
客户信息相关的特征:bc_open_to_buy / num_op_rev_tl。这两个特征都与循环账户和银行卡有关,因此它们高度相关。为了避免多协同问题,去掉初始模型中的bc_open_to_buy特性。revol_util / bc_util。也是一个类似的情况,可以删除bc_util特性。 贷款信息特性:Int_rate和grade是基于借贷专有模型的sub_grade的衍生品;因此它们是高度相关的;我们把这些删除。这里的sub_grade和loan_amount也是相关的,但关联度较低,可以保留它们。
loans.drop(["bc_util", "bc_open_to_buy","int_rate", "grade"], axis = 1, inplace = True)
第四步:找出特征与目标变量之间的相关性
使用pandas自带的corr函数
loans_cor=loan.corr()
loans_cor
使用seaborn热点图
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=(10,6))
sns.heatmap(loans_cor, annot=True)
Estimator——核心使用的算法;在这个们的例子中将使用 LogisticRegression() 算法; k_features — 希望算法选择为最佳特征的特征数(默认为 1)。它应该小于数据集的所有特征数总和。mlxtend 包还提供了“best”参数,其中选择器返回最佳交叉验证性能。因此,与其猜测需要返回多少特征,不如应用“best”; Forward 和 floating 参数来标识包装器方法:例如,对于我们的前向选择,它将是forward = True,而floating = False; Scoring :指定了评估标准:使用 sklearn 评分指标“precision”。对于分类器,因为数据集是不平衡的。我们还可以使用 f1、precision、recall、roc_auc 等用于分类任务的指标和 r2 、mean_absolute_error、mean_squared_error/neg_mean_squared_error、median_absolute_error 用于回归任务的指标; cv——交叉验证,默认为5。
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.preprocessing import MinMaxScaler
X = loans.drop('loan_status', axis=1)
y = loans[['loan_status']]
y = y.values.ravel() X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42, stratify=y)
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
from mlxtend.feature_selection import SequentialFeatureSelector as SFS sfs = SFS(LogisticRegression(),
k_features='best',
forward=True,
floating=False,
scoring = 'precision',
cv = 0)
sfs.fit(X, y)
sfs.k_feature_names_
from mlxtend.plotting import plot_sequential_feature_selection as plot_sfs
import matplotlib.pyplot as plt
fig1 = plot_sfs(sfs.get_metric_dict(), kind='std_dev') plt.title('Sequential Forward Selection')
plt.grid()
plt.show()
04 总结
https://www.kaggle.com/code/mariiagusarova/feature-selection-techniques
作者:Maria Gusarova
-猜你喜欢👇