比赛代码3(Everyone Do this at the Beginning!!)

代码地址

该代码功能主要是去掉特征中的无用特征

作者思路:

先找出需要去掉的特征,其中包括:

  • 特征中缺失值多的
  • 特征中特征值倾斜程度大的
  • 高相关的两个特征中特征值少的。(这里直接去掉的原因时因为比赛有要求的时间限制,所以我们在处理特征时要先考虑跑代码时的时间)

然后在总数中去掉这些特征,减去这些特征列之后再在总的Dataframe中去掉含有缺失值的样本,所以最终得到的样本中没有缺失值且比较精炼。

分析原始代码:

从以下处理缺失值过多的特征:

(train.isnull().sum()/train.shape[0]).sort_values(ascending=False)
#然后将其中缺失值超过了99%的特征添加入要删除的特征名单中
droppable_features.append('PuaMode')
droppable_features.append('Census_ProcessorClass')

从以下处理倾斜度过大的特征:

pd.options.display.float_format = '{:,.4f}'.format
sk_df = pd.DataFrame([{'column': c, 'uniq': train[c].nunique(), 'skewness': 
#统计特征中的values,然后用归一化,最后将最大的值*100(既是去掉他的百分号)
train[c].value_counts(normalize=True).values[0] * 100} for c in train.columns])
#用图表的方式观察他们的特征倾斜程度
sk_df = sk_df.sort_values('skewness', ascending=False)
#将倾斜度过大的特征添加入要去掉的特征的名单中
droppable_features.extend(sk_df[sk_df.skewness > 99].column.tolist())

然后就可以在train中将他们删除了

#PuaMode在两个分类中重复了,所以要删除其中一个.
droppable_features.remove('PuaMode')

# Drop these columns.
train.drop(droppable_features, axis=1, inplace=True)

然后找出特征中缺失值超过了10%的特征,将他们的缺失值用0代替

null_counts = train.isnull().sum()
null_counts = null_counts / train.shape[0]
#找出缺失值超过了10%的特征的名字
null_counts[null_counts > 0.1]
#后简单分析他们的特征值和将他们的缺失值用0代替	
train.replace({'OrganizationIdentifier': {np.nan: 0}}, inplace=True)
#其中分析到Census_InternalBatteryType特征时,因为它的特征值太过奇怪,所以要将其特征值标准一下,并且将乱码的特征值用unknown代替
trans_dict = {
    '˙˙˙': 'unknown', 'unkn': 'unknown', np.nan: 'unknown'
}
train.replace({'Census_InternalBatteryType': trans_dict}, inplace=True)

然后就时在总的特征中去掉含有缺失值的样本,进一步缩减样本的规模

train.dropna(inplace=True)

因为MachineIdentifier特征对预测结果是没有作用的,所以在train样本中将这一列特征给去掉

train.drop('MachineIdentifier', axis=1, inplace=True)

是给特征编码的操作

train['SmartScreen'] = train.SmartScreen.astype('category')
train['Census_InternalBatteryType'] = train.Census_InternalBatteryType.astype('category')

cate_cols = train.select_dtypes(include='category').columns.tolist()
#将需要编码的特征归结为一个列表
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
#LabelEncoder 是对不连续的数字或者文本进行编号,详细看[LabelEncoder](https://blog.youkuaiyun.com/u012560212/article/details/53405338)
for col in cate_cols:
    train[col] = le.fit_transform(train[col])

寻找相关特征 (用热力图辅助) 并且去掉其中特征值较少的特征

先10列10列的寻找

import seaborn as sns
#引入热力图的库
plt.figure(figsize=(10,10))
co_cols = cols[:10]
co_cols.append('HasDetections')
sns.heatmap(train[co_cols].corr(), cmap='RdBu_r', annot=True, center=0.0)
plt.title('Correlation between 1 ~ 10th columns')
plt.show()

然后观察热力图中相关系数大于0.99的两个特征,将他们进行对比分析,看他们的特征值的数量的多少进行筛选。

如:
其中的Platform和OsVer的相关系数大于0.99,所以要将他们进行对比操作,如

print(train.Platform.nunique())
print(train.OsVer.nunique())

观察到他们的特征数量为

3
45

所以我们保留Osver,去掉Platform

corr_remove.append('Platform')

后面的操作与上面操作相同。

最后在总的特征中寻找相关性

corr = train.corr()
high_corr = (corr >= 0.99).astype('uint8')
#将大于0.99的相关性用1表示
plt.figure(figsize=(15,15))
sns.heatmap(high_corr, cmap='RdBu_r', annot=True, center=0.0)
plt.show()

出来的图为下图
在这里插入图片描述

print(train.Census_OSArchitecture.nunique())
print(train.Processor.nunique())

3
3

因为两个的特征值相同,所以再对比他们对标签HasDetections的影响

train[['Census_OSArchitecture', 'Processor', 'HasDetections']].corr()

在这里插入图片描述
从结果看出来他们的任何数据都是一样的,所以我们去掉其中的哪一个都可以。

corr_remove.append('Processor')

最后在要去掉的特征的列表中加入我们相关性中要去掉的特征列表

droppable_features.extend(corr_remove)

OVER~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值