#集成学习下 蒸汽量预测
开源学习指路:datawhale
1.赛题思路
简单总结一下做题的思路:
- EDA: 融合训练集和测试集,根据kdeplot看一下连续数据(训练集和测试集)的分布情况,然后筛选出其中分布不均的特征数据,并在训练集和测试集中去除这些特征数据
- 查看特征之间的相关性(一般用spearman相关系数)
- 设定一个相关系数的阈值,去除相关系数低于这个阈值的特征
- 对已经完成以上清洗的特征数据进行归一化处理
- 特征工程:
- 1.box-cox变换,使特征数据满足正态分布(一般模型假设都是假设数据为正态分布,采用数据变换可以方便后续模型的应用)。用qq图直观描述box-cox变换后数据是否符合正态分布
- 2.对数变换:这一步也是数据变换,主要作用是提升特征数据的正态性(可以这样理解,取对数可以将中位数的值按比例缩小,从而形成正态分布的数据)
- 剔除训练数据中的异常值(用回归,如岭回归ridge regression)
- 根据去除了异常值的训练数据训练模型~
- 预测
2.核心代码(具体参考开源指路~)
- EDA
for column in data_all.columns[0:-2]:
#核密度估计(kernel density estimation)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。通过核密度估计图可以比较直观的看出数据样本本身的分布特征。
g = sns.kdeplot(data_all[column][(data_all["oringin"] == "train")], color="Red", shade = True)
g = sns.kdeplot(data_all[column][(data_all["oringin"] == "test")], ax =g, color="Blue", shade= True)
g.set_xlabel(column)
g.set_ylabel("Frequency")
g = g.legend(["train","test"])
plt.show()
- 查看特征之间关联程度
data_train1=data_all[data_all["oringin"]=="train"].drop("oringin",axis=1)
plt.figure(figsize=(20, 16)) # 指定绘图对象宽度和高度
colnm = data_train1.columns.tolist() # 列表头
mcorr = data_train1[colnm].corr(method="spearman") # 相关系数矩阵,即给出了任意两个变量之间的相关系数
mask = np.zeros_like(mcorr, dtype=np.bool) # 构造与mcorr同维数矩阵 为bool型
mask[np.triu_indices_from(mask)] = True # 角分线右侧为True
cmap = sns.diverging_palette(220, 10, as_cmap=True) # 返回matplotlib colormap对象,调色板
g = sns.heatmap(mcorr, mask=mask, cmap=cmap, square=True, annot=True, fmt='0.2f') # 热力图(看两两相似度)
plt.show()
- 归一化
cols_numeric=list(data_all.columns)
cols_numeric.remove("oringin")
def scale_minmax(col):
return (col-col.min())/(col.max()-col.min())
scale_cols = [col for col in cols_numeric if col!='target']
data_all[scale_cols] = data_all[scale_cols].apply(scale_minmax,axis=0)
data_all[scale_cols].describe()
- box-cox变换
cols_transform=data_all.columns[0:-2]
for col in cols_transform:
# transform column
data_all.loc[:,col], _ = stats.boxcox(data_all.loc[:,col]+1)
print(data_all.target.describe())
plt.figure(figsize=(12,4))
plt.subplot(1,2,1)
sns.distplot(data_all.target.dropna() , fit=stats.norm);
plt.subplot(1,2,2)
_=stats.probplot(data_all.target.dropna(), plot=plt)
- 对数变换
sp = data_train.target
data_train.target1 =np.power(1.5,sp)
print(data_train.target1.describe())
plt.figure(figsize=(12,4))
plt.subplot(1,2,1)
sns.distplot(data_train.target1.dropna(),fit=stats.norm);
plt.subplot(1,2,2)
_=stats.probplot(data_train.target1.dropna(), plot=plt)