数据特征选取
1.根据相关性进行选取
通过热力图观察特征之间的相似度,然后进行特征选取
如:这是三十个特征的热力图
从热力图上可以发现,radius_mean,perimeter_mean 和 area_mean 是相关的,因此我们仅使用 area_mean
compactness_mean, concavity_mean 和 concave points_mean 是两两相关的,因此我们只选取concavity_mean
radius_se,perimeter_se,area_se相关,仅选用area_se
radius_worst,perimeter_worst,area_worst相关,仅选用area_worst
compactness_worst,concavity_worst,concave points_worst相关,仅选用concavity_worst
compactness_se,concavity_se,concave points_se相关,仅选用concavity_se
texture_worst,texture_mean相关,仅选用texture_mean
area_worst,area_mean相关,仅选用area_mean
提取后十六个特征的热力图
代码为:
#观察所有特征的相关性
#Heatmap(热力图):将所有特征的成对相关系数以热力矩阵形式描述
#颜色越浅为相关性大的特征,如果相关性大则从中选取其中一个特征作为代表即可
#特征选择的目的是降维,用少量的特征代表数据的特性,这样也可以增强模型的泛化能力,避免数据过拟合
f,ax = plt.subplots(figsize=(18,18))
sns.heatmap(x.corr(),annot=True,linewidths=.5 , fmt = ‘.1f’,ax = ax)
需要导入的库:import seaborn as sns
2.根据swarm图来选取特征
可以清晰的看出第一个特征两种类别分布较好,更适合分类,而第二个特征则不适合分类。
代码为:
sns.set(style=“whitegrid” , palette=“muted”)
data_dia = y
data = x
data_n_2 = (data - data.mean()) / (data.std()) #归一化处理,便于展示 std()返回数据的标准差 mean()返回数据的平均值
#前十列属性 concave points_mean也适合分类
data = pd.concat([y , data_n_2.iloc[:,0:10]],axis=1)
print(“data的头:”)
print(data.head())
print(data.columns)
data=pd.melt(data,id_vars=“diagnosis”,var_name=“features”,value_name=“value”)
plt.figure(figsize=(10,10))
tic = time.time()
sns.swarmplot(x = “features” , y = “value” , hue=“diagnosis” , data = data)
plt.xticks(rotation = 90)
3.使用 SelectKBest单变量特征选择
通过卡方验证进行特征选择,通过卡方检验的得分来选择与类别(y)更加有关的特征
卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度
需要引入两个机器学习的库模型
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
代码为
#拆分数据
x_train,x_test,y_train,y_test = train_test_split(x_1,y,test_size=0.3,random_state=42) #random_state设置随机数种子
#2.单变量特征选择
select_feature = SelectKBest(chi2 , k = 5).fit(x_train,y_train)
print('Score list: ', select_feature.scores_)
print('Feature list: ’ , x_train.columns)
x_train_2 = select_feature.transform(x_train) #返回新的训练集
x_test_2 = select_feature.transform(x_test) #返回新的测试集
4.递归特征消除 (RFE)
RFE使用某一种分类方法(在我们的示例中是random forest),为每个特性分配权重,其绝对权重最小的则从当前特征集合中删除。该过程在修剪集上递归地重复,直到特征数量到达预设值
需要引入库模型from sklearn.feature_selection import RFE
代码为
clf_rf_3 = RandomForestClassifier()
rfe = RFE(estimator=clf_rf_3 , n_features_to_select=5 , step=1)
rfe = rfe.fit(x_train , y_train)
print(‘RF Chosen best 5 feature by rfe:’,x_train.columns[rfe.support_]
5.交叉验证递归特征消除(RFECV)
使用RFECV方法,不仅可以找到最佳特征,而且还可以找到需要多少个特征以获得最佳准确性
需要引入库模型from sklearn.feature_selection import RFECV
代码为:
clf_rf_4 = RandomForestClassifier()
rfecv = RFECV(estimator=clf_rf_4 , step=1 , cv = 5 , scoring=‘accuracy’) #5折交叉验证
rfecv = rfecv.fit(x_train,y_train)
print('Optimal number of features: ',rfecv.n_features_)
print('Best features: ',x_train.columns[rfecv.support_])
plt.figure()
plt.xlabel(“Number of features selected”)
plt.ylabel(“Cross validation score of number of selected features”)
plt.plot(range(1,len(rfecv.grid_scores_)+1),rfecv.grid_scores_)