大家好,特征选择是机器学习流程中的关键步骤,在实践中通常有大量的变量可用作模型的预测变量,但其中只有少数与目标相关。特征选择包括找到这些特征的子集,主要用于改善泛化能力、助力推断预测、提高训练效率。有许多技术可用于执行特征选择,每种技术的复杂性不同。
本文将介绍一种使用强大的开源优化工具Optuna来执行特征选择任务的创新方法,主要思想是通过有效地测试不同的特征组合(例如,不是逐个尝试它们)来处理各种任务的特征选择的灵活工具。下面,将通过一个实际示例来实施这种方法,并将其与其他常见的特征选择策略进行比较。
1.数据准备
将利用基于Kaggle上的Mobile Price Classification数据集进行分类任务。该数据集包含20个特征,其中包括:'battery_power'、'clock_speed'和'ram' 等,用于预测'price_range'特征,该特征可以分为四个不同的价格范围:0、1、2和3。我们将数据集分成训练集和测试集,并在训练集中准备了一个5折交叉验证分割。
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedKFold
SEED = 32
# Load data
df = pd.read_csv("mpc_train.csv")
# Train - test split
df_train, df_test = train_test_split(df, test_size=0.2, stratify=df.iloc[:,-1], random_state=SEED)
df_train = df_train.reset_index(drop=True)
df_test = df_test.reset_index(drop=True)
# The last column is the target variable
X_train = df_train.iloc[:,0:20]
y_train = df_train.iloc[:,-1]
X_test = df_test.iloc[:,0:20]
y_test = df_test.iloc[:,-1]
# Stratified kfold over the train set for cross validation
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=SEED)
splits = list(skf.split(X_train, y_train))
len(splits)

将使用随机森林分类器模型,使用scikit-learn实现并采用默认参数。我们首先使用所有特征训练模型来设置基准。我们将测量的指标是针对所有四个价格范围加权的F1分数。在对训练集进行学习后,我们在测试集上对其进行评估,得到的F1分数约为0.87。
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import f1_score, classification_report
model = RandomForestClassifier(random_state=SEED)
model.fit(X_train,y_train)
preds = model.predict(X_test)
print(classification_report(y_test, preds))
print(f"Global F1: {f1_score(y_test, preds, average='weighted')}")

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



