特征工程和特征选择是机器学习流程中至关重要的环节,直接影响到模型的性能。特征工程涉及从原始数据中提取或构造有用的特征,而特征选择则是从已有的特征集中挑选出最相关的子集。
特征工程
特征工程是指创建能够使机器学习算法更好地理解数据的新特征的过程。这包括处理缺失值、编码分类变量、标准化数值特征等。
示例:特征工程在泰坦尼克号生存预测中的应用
假设一个泰坦尼克号乘客的数据集目标是预测哪些乘客可能幸存。
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# 加载数据
data = pd.read_csv('titanic.csv')
# 数据预处理
def preprocess_data(df):
# 填充缺失值
df['Age'].fillna(df['Age'].median(), inplace=True)
df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)
# 创建新特征
df['FamilySize'] = df['SibSp'] + df['Parch'] + 1
df['IsAlone'] = 1 # 初始化为1
df.loc[df['FamilySize'] > 1, 'IsAlone'] = 0
return df
# 处理数据
data = preprocess_data(data)
# 定义特征和标签
features = ['Pclass', 'Sex', 'Age', 'Fare', 'Embarked', 'FamilySize', 'IsAlone']
X = data[features]
y = data['Survived']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 特征转换
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), ['Age', 'Fare', 'FamilySize']),
('cat', OneHotEncoder(), ['Pclass', 'Sex', 'Embarked', 'IsAlone'])
])
# 创建管道
pipeline = Pipeline(steps=[
('preprocessor', preprocessor),
('classifier', RandomForestClassifier(random_state=42))
])
# 训练模型
pipeline.fit(X_train, y_train)
# 预测
predictions = pipeline.predict(X_test)
# 评估模型
print("Accuracy:", accuracy_score(y_test, predictions))
-
数据加载:
- 使用
pandas
读取CSV文件。
- 使用
-
数据预处理:
preprocess_data
函数用于填充缺失值,并创建新的特征FamilySize
(家庭大小)和IsAlone
(是否独自一人)。
-
特征和标签定义:
- 选择相关特征并分离标签。
-
数据划分:
- 将数据划分为训练集和测试集。
-
特征转换:
- 使用
ColumnTransformer
对数值特征进行标准化,对分类特征进行独热编码。
- 使用
-
创建管道:
- 使用
Pipeline
将特征转换和分类器组合在一起,简化了模型训练过程。
- 使用
-
训练和评估:
- 训练随机森林分类器并评估其在测试集上的准确率。
特征选择
特征选择是从现有特征集中挑选出最相关于目标变量的子集的过程。常用的方法包括基于统计测试的选择方法、递归特征消除(RFE)等。
示例:使用递归特征消除(RFE)进行特征选择
继续使用泰坦尼克号数据集,将使用RFE来选择最重要的特征。
from sklearn.feature_selection import RFE
# 使用RFE进行特征选择
selector = RFE(estimator=RandomForestClassifier(random_state=42), n_features_to_select=5, step=1)
selector = selector.fit(X_train, y_train)
# 获取所选特征
selected_features = X_train.columns[selector.support_]
print("Selected Features:", selected_features)
# 使用选定的特征重新训练模型
X_train_selected = X_train[selected_features]
X_test_selected = X_test[selected_features]
# 重新创建管道
pipeline = Pipeline(steps=[
('preprocessor', preprocessor),
('classifier', RandomForestClassifier(random_state=42))
])
# 训练模型
pipeline.fit(X_train_selected, y_train)
# 预测
predictions = pipeline.predict(X_test_selected)
# 评估模型
print("Accuracy with Selected Features:", accuracy_score(y_test, predictions))
-
特征选择:
- 使用
RFE
类进行递归特征消除,指定要选择的特征数量为5。 fit
方法训练RFE模型,并返回选择的特征。
- 使用
-
获取所选特征:
- 通过
selector.support_
获取所选特征的索引,然后从原始特征列表中提取这些特征。
- 通过
-
重新训练模型:
- 使用选定的特征重新训练随机森林分类器,并评估其性能。
通过上述示例,可以看到特征工程和特征选择是如何帮助我们提高模型性能的。特征工程可以创建更有意义的特征,而特征选择可以帮助我们找到最相关的特征,从而简化模型并提高泛化能力。