特征选择
1.1 原理
特征选择是选择对模型训练最重要的特征,减少数据维度,去除冗余或不相关特征,提高模型性能的性能和训练速度,减少过拟合。
1.2 核心公式
可以使用基于树模型的特征重要性度量,如在随机森林中计算特征的重要性:
其中,Ii,j是第j棵树中特征Xi的重要性度量。
假设使用基于Gini系数的特征重要性计算方法,单棵树的特征重要性可以表示为:
其中,T是所有包含特征Xi的节点,Nt是节点t的样本数量,N是总样本数量,是节点t上的Ginit系数变化。
1.3 Python案列
python">import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest, f_classif,␣
,
→mutual_info_classif
from sklearn.preprocessing import StandardScaler
# 加载数据集
data = load_iris()
X = data.data
y = data.target
# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 特征选择方法
selectors = [
('SelectKBest_f_classif', SelectKBest(score_func=f_classif, k=2)),
('SelectKBest_mutual_info_classif',␣
,
→SelectKBest(score_func=mutual_info_classif, k=2))
]
# 绘制图形
plt.figure(figsize=(14, 6))
for i, (name, selector) in enumerate(selectors):
plt.subplot(1, 2, i + 1)
X_new = selector.fit_transform(X_scaled, y)
mask = selector.get_support()
plt.scatter(X_new[:, 0], X_new[:, 1], c=y, edgecolor='k', s=50)
plt.title(f'{name} Feature Selection')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.tight_layout()
plt.show()
特征缩放
2.1 原理
减少特征值范围的差异,帮助某些算法更快收敛,常用于标准化和归一化之外的方法。
2.2 核心公式
最大最小缩放
其中,Xmax和Xmin分别是特征的最大值和最小值。
对数变换
其中,加1是为了避免对数零或负值问题。
2.3 Python案例
python">import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 加载Iris数据集
iris = load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['species'] = iris.target
# 原始数据集的散点图
sns.pairplot(df, hue='species', markers=['o', 's', 'D'])
plt.suptitle('Original Data', y=1.02)
plt.show()
# 标准化
scaler = StandardScaler()
#data_standardized = scaler.fit_transform(df.iloc[:,:-1])
#df_standardized = pd.DataFrame(data_standardized, columns=iris.feature_names)
df_standardized = pd.DataFrame(scaler.fit_transform(df.iloc[:, :-1]),␣
,
→columns=iris.feature_names)
df_standardized['species'] = df['species']
# 标准化数据集的散点图
sns.pairplot(df_standardized, hue='species', markers=['o', 's', 'D'])
plt.suptitle('Standardized Data', y=1.02)
plt.show()
# 最小最大缩放
scaler = MinMaxScaler()
df_minmax = pd.DataFrame(scaler.fit_transform(df.iloc[:, :-1]), columns=iris.
,
→feature_names)
df_minmax['species'] = df['species']
# 最小最大缩放数据集的散点图
sns.pairplot(df_minmax, hue='species', markers=['o', 's', 'D'])
plt.suptitle('Min-Max Scaled Data', y=1.02)
plt.show()
特征构造
3.1 原理
特征构造可以中的隐藏关系,提升模型表现。
3.2 Python案例
python">import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 生成示例数据
np.random.seed(42)
data = pd.DataFrame({
'area': np.random.randint(1000, 3500, 100),
'bedrooms': np.random.randint(1, 5, 100),
'bathrooms': np.random.randint(1, 3, 100),
'price': np.random.randint(100000, 500000, 100)
})
# 构造新特征
data['price_per_sqft'] = data['price'] / data['area']
data['bed_bath_ratio'] = data['bedrooms'] / data['bathrooms']
# 绘制图形
plt.figure(figsize=(14, 6))
# 图形1:价格与每平方英尺价格的关系
plt.subplot(1, 2, 1)
sns.scatterplot(x=data['area'], y=data['price_per_sqft'])
plt.title('Price per Square Foot vs Area')
plt.xlabel('Area (sqft)')
plt.ylabel('Price per Square Foot ($)')
# 图形2:价格与卧室-浴室比例的关系
plt.subplot(1, 2, 2)
sns.scatterplot(x=data['bed_bath_ratio'], y=data['price'])
plt.title('Price vs Bedroom-Bathroom Ratio')
plt.xlabel('Bedroom-Bathroom Ratio')
plt.ylabel('Price ($)')
plt.tight_layout()
plt.show()
# 更多图形
plt.figure(figsize=(14, 6))
# 图形3:面积与价格的关系
plt.subplot(1, 2, 1)
sns.scatterplot(x=data['area'], y=data['price'])
plt.title('Area vs Price')
plt.xlabel('Area (sqft)')
plt.ylabel('Price ($)')
# 图形4:每平方英尺价格的分布
plt.subplot(1, 2, 2)
sns.histplot(data['price_per_sqft'], kde=True)
plt.title('Distribution of Price per Square Foot')
plt.xlabel('Price per Square Foot ($)')
plt.ylabel('Frequency')
plt.tight_layout()
plt.show()