阿里云天池大赛工业蒸汽预测学习(3)

``最近开始了本赛题特征工程部分的学习

**概念:**特征工程就是从原始数据提取特征的过程,这些特征可以很好的描述数据,并且利用特征建立的模型在位置数据上的性能表现可以达到最优
流程
1.去掉无用特征
2.去除冗余特诊,利用存在的特征,转换特征,内容中的特征以及其他数据源生成新特征
3.对特征进行处理

赛题部分:
异常值分析

 plt.figure(figsize=(18,10))
 plt.boxplot(x=train_data.values,labels=train_data.columns)
 plt.hlines([-7.5,7.5],0,40,colors='r')
 plt.show()

这里绘制各个特征的箱线图观察数据分布。通过绘图可以看出有些数据存在明显的异常值
运行结果展示
可以看出,V9中就有明显的异常值,下面将这些异常值删除。

train_data=train_data[train_data['V9']>-7.5]#每个样本含的内容都有v0~target,选取v9>-7.5的样本
test_data=test_data[test_data['V9']>-7.5]#选取测试集中V9>7.5的样本

接下来对数据进行归一化处理

**归一化:**归一化,就是把原来数据范围缩小(或放大)到 0 和 1 的范围。
优点:
归一化后加快了梯度下降求最优解的速度,如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收敛甚至不能收敛。

归一化有可能提高精度,一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。

#数据的归一化处理
features_columns=[col for col in train_data.columns if col not in ['target']]#选取V0~~V37
min_max_scaler=preprocessing.MinMaxScaler(feature_range=(0,1))
min_max_scaler=min_max_scaler.fit(train_data[features_columns])#求得train_data数据中的一些属性


train_data_scaler=min_max_scaler.transform(train_data[features_columns])#在fit的基础上,进行标准化,降维,归一化等操作
test_data_scaler=min_max_scaler.transform(test_data[features_columns])


train_data_scaler=pd.DataFrame(train_data_scaler)#转化为dataframe
train_data_scaler.columns=features_columns#改换DataFrame的索引


test_data_scaler=pd.DataFrame(test_data_scaler)
test_data_scaler.columns=features_columns
train_data_scaler['target']=train_data['target']

python提供了归一化方法。即:MinMaxScaler.fit和MinMaxScaler.transform函数。二者结合使用就可以将数据归一化。

查看数据分布前面的绘图中会发现特征变量V5,V9,V11,V17,V22,V28在训练集和测试集中的分布差异比较大,会影响模型的泛化能力,所以要删除这些特征

drop_col=6
drop_row=1
plt.figure(figsize=(5*drop_col,5*drop_row))

for i,col in enumerate(["V5","V9","V11","V17","V22","V28"]):
    ax=plt.subplot(drop_row,drop_col,i+1)
    ax=sns.kdeplot(train_data_scaler[col],color='Red',shade=True)
    ax=sns.kdeplot(test_data_scaler[col],color='Blue',shade=True)
    ax.set_xlabel(col)
    ax.set_ylabel("Frequency")
    ax=ax.legend(["train","test"])
plt.show()

在这里插入图片描述
如图可以看出这些变量在训练集和测试集中区别较大
特征相关性:计算特征的相关性,以热力图的形式显示

plt.figure(figsize=(20,16))
column=train_data_scaler.columns.tolist()
mcorr=train_data_scaler[column].corr(method="spearman")
mask=np.zeros_like(mcorr,dtype=np.bool)
mask[np.triu_indices_from(mask)]=True
cmap=sns.diverging_palette(220,10,as_cmap=True)
g=sns.heatmap(mcorr,mask=mask,cmap=cmap,square=True,annot=True,fmt='0.2f')
plt.show()

DataFrame.corr(method=‘pearson’,min_periods=1)
参数pearson:Pearson相关系数来衡量两个数据集合是否在一条线上面,针对线性数据的相关系数计算,针对非线性数据会有误差。

np.zeros_like(a)函数:构建一个与a同维度的数组,初始化所有变量位0

np.triu_indices_from返回上三角矩阵的index

特征降维:
进行特征相关性筛选,筛选相关性>0.1的特征

mcorr=mcorr.abs()
numerical_corr=mcorr[mcorr['target']>0.1]['target']
print(numerical_corr.sort_values(ascending=False))#sort排序函数,参数为false表示降序排序

多重共线性分析:
原则:特征组之间的相关性系数较大,可能存在较大的共线性影响导致模型估计不准确,因此后续要使用PCA对数据进行处理,去除多重共线性
具体相关参考:https://blog.csdn.net/weixin_45288557/article/details/111769464?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164748951416781683914708%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164748951416781683914708&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-111769464.142v2pc_search_insert_es_download,143v4control&utm_term=%E5%A4%9A%E9%87%8D%E5%85%B1%E7%BA%BF%E6%80%A7&spm=1018.2226.3001.4187

多重共线性定义:在进行线性回归分析时,容易出现自变量(解释变量)之间彼此相关的现象,我们称这种现象为多重共线性

多重共线性问题就是指一个解释变量的变化引起另一个解释变量的变化。

pca=PCA(n_components=16)
new_train_pca_90=pca.fit_transform(train_data_scaler.iloc[:,0:-1])

new_test_pca_90=pca.transform(test_data_scaler)
new_train_pca_90=pd.DataFrame(new_train_pca_90)
new_test_pca_90=pd.DataFrame(new_test_pca_90)
new_train_pca_90['target']=train_data_scaler['target']
print(new_train_pca_90.describe())

保留了16个主成分

总结:本特征工程中流程
1.主要是通过箱线图查看总体数据分布寻找异常值。将异常值删除。
2.对数据进行归一化方便后续处理。
3.删除数据中训练集和测试集误差较大的数据。否则用测试集测试的时候可能会误以为模型欠拟合。
4.最后检查数据的多重共线性,通过PCA技术降维,消除多重共线性

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阿里云天池大赛工业蒸汽预测是一个时间序列预测问题,可以使用R语言中的时间序列分析和建模工具进行解决。以下是一个简单的R语言代码示例,用于预测未来的蒸汽量。 首先,我们需要读入数据并对其进行预处理。这个数据集包含了两个变量:日期和蒸汽量。 ```r # 读入数据 data <- read.csv("data.csv") # 转换日期格式 data$DATE <- as.Date(data$DATE, format = "%Y/%m/%d") # 将日期设置为数据框的行名 rownames(data) <- data$DATE # 移除日期变量 data$DATE <- NULL ``` 接下来,我们可以绘制数据的时间序列图,以便更好地了解数据的性质。 ```r # 绘制时间序列图 plot(data$V1, type = "l", xlab = "日期", ylab = "蒸汽量") ``` 然后,我们可以使用时间序列分解方法,将时间序列分解为趋势、季节性和随机性三个部分,并对其进行可视化。 ```r # 时间序列分解 ts.decomp <- decompose(data$V1) # 可视化分解结果 plot(ts.decomp) ``` 分解结果表明,该时间序列具有明显的季节性和趋势,但是随机性较小。 接下来,我们可以使用ARIMA模型进行时间序列预测。ARIMA模型是一种常用的时间序列建模方法,可以用于预测未来的蒸汽量。 ```r # 拟合ARIMA模型 arima.model <- arima(data$V1, order = c(1, 1, 1), seasonal = list(order = c(0, 1, 1), period = 7)) # 预测未来7天的蒸汽量 forecast <- predict(arima.model, n.ahead = 7) # 输出预测结果 print(forecast$pred) ``` 以上代码中,我们使用ARIMA(1,1,1)模型,并将季节性设置为7,以便对一周内的季节性进行建模。最后,我们使用predict函数预测未来7天的蒸汽量,并输出预测结果。 这是一个简单的R语言示例,用于预测未来的蒸汽量。您可以根据实际情况进行修改和扩展,以获得更好的预测结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值