过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
一、皮尔逊相关性系数
绘制皮尔逊相关系数热力图展示特征之间的相关性。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('/diabetes.csv')
# 筛选数据
df_droped = df.drop('Outcome', axis=1)
# 显示负数
plt.rcParams['axes.unicode_minus'] = False
# 正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
# 设置图形大小
plt.figure(figsize=(10, 10))
# 绘制相关性图
sns.heatmap(df_droped.corr(),annot=True)
# 添加标题
plt.title('相关性热力图')
# 显示图形
plt.show()
二、卡方检验判定数据之间的相关性
使用 sklearn 中的 SelectKBest 进行特征筛选 使用卡方检验筛选数据特征,需要加载 sklearn 库中的 chi2。
import pandas as pd
from sklearn.feature_selection import SelectKBest, chi2
import numpy as np
from sklearn.preprocessing import LabelEncoder
# 加载数据
df = pd.read_csv('/drug_dataset.csv')
# 分类数据编码
encond = LabelEncoder()
df['Sex'] = encond.fit_transform(df['Sex'])
df['BP'] = encond.fit_transform(df['BP'])
df['Cholesterol'] = encond.fit_transform(df['Cholesterol'])
df['Drug'] = encond.fit_transform(df['Drug'])
# 确定变量
x = df.drop('Drug', axis=1)
y = df['Drug']
# 筛选特征
select = SelectKBest(score_func = chi2, k=4)
select.fit_transform(x,y)
{'筛选出来的最优特征是': list(select.get_feature_names_out())}
三、使用方差分析实现特征筛选
将上述代码中 score_fun 的值替换为 f_classif。
from sklearn.feature_selection import f_classif
# 筛选特征
select = SelectKBest(score_func = f_classif, k=4)
select.fit_transform(x,y)
{'筛选出来的最优特征是': list(select.get_feature_names_out())}
四、根据互信息去进行特征选择
将上述代码中 score_fun 的值替换为 mutual_info_classif。
from sklearn.feature_selection import mutual_info_classif
# 筛选特征
select = SelectKBest(score_func = mutual_info_classif, k=4)
select.fit_transform(x,y)
{'筛选出来的最优特征是': list(select.get_feature_names_out())}