赛题描述
经脱敏后的锅炉传感器采集的数据(采集频率是分钟级别),根据锅炉的工况,预测产生的蒸汽量。
数据说明
数据分成训练数据(train.txt)和测试数据(test.txt),其中字段”V0”-“V37”,这38个字段是作为特征变量,”target”作为目标变量。选手利用训练数据训练出模型,预测测试数据的目标变量,排名结果依据预测结果的MSE(mean square error)。
#导入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.utils import shuffle#导入数据
file_input=r'D:\tianchi test\gongye zhengqi\zhengqi_train.txt'
file_input2=r'D:\tianchi test\gongye zhengqi\zhengqi_test.txt'
output_file=r'D:\tianchi test\gongye zhengqi\output_file.csv'
data_train=np.loadtxt(file_input,skiprows=1)
data_test=np.loadtxt(file_input2,skiprows=1)
data_train=pd.DataFrame(data_train)
data_test=pd.DataFrame(data_test)
变量y为连续变量,在特征筛选时,转为y1变量,进行特征筛选。
#数据探索
print(data_train.info())
print(data_test.info())
print(data_train.describe().T)
#数据无缺失,数据基本上在1-10之间。
#V5、V17、V22标准偏差0.51,其他接近1
#V3、V5、V9、V11等多个变量平均值为负数。
#V5最大值为0.4,最小值为-2.18;V27最大值为0.925,最小值为-1.16
#V37预测结果,结果最小值为-3.0,最大值为2.5。产生蒸汽量存在负值,有点奇怪。。。
print(data_train.head(2))shuffle(data_train) #打乱样本数据
X=data_train.iloc[:,:-1].values
y=data_train.iloc[:,-1].values #y为连续变量,如何处理??#参数意义不明,绘图没有意义。
#变量y为连续变量,不便于进行变量筛选,观察y分布,并对y进行离散化处理进行变量筛选。
plt.hist(y,bins=50)
plt.show()
#变量y服从偏态分布,数值在0-1区间较为集中。因此,用astype(int)得到的数据分布为0较多。
#y=data_train.iloc[:,-1].values.astype(int) #用该方法处理得到的数据不好。y1=list(map(lambda x:round(x,1)*10,y)) #增加list显示数据,考虑数据取整
变量特征筛选有很多方法,
方法一:采用了linearSVC 、SelectFromModel,变量由37个减少至27个。
#筛除特征变量
#直接进行样本挑选,37个变量太多。
#采用linearsvc方法
from sklearn.svm import LinearSVC
from sklearn.feature_selection import SelectFromModel
lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y1)
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)
print(X_new.shape) #线形回归后,剩余27个变量
#采用决策树模型,筛选变量
from sklearn.ensemble import ExtraTreesClassifier #决策树回归模型
from sklearn.feature_selection import SelectFromModel
clf= ExtraTreesClassifier() # 建立决策树回归模型,筛选变量
clf.fit(X, y1)
print(clf.feature_importances_)
model = SelectFromModel(clf, prefit=True)
X_new = model.transform(X)
print(X_new.shape) #用决策树处理后,剩余18个变量
#采用随机森林回归预测分析
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor, GradientBoostingRegressor
rfr = RandomForestRegressor()
rfr.fit(X_new, y)
print(y)
y_predict = rfr.predict(X_new)
print(y_predict)
#模型评估
#原函数拟合情况
print("随机森林回归的默认评估值为:", rfr.score(X_new, y))
print("随机森林回归的R_squared值为:", r2_score(y, y_predict))
print("随机森林回归的均方误差为:", mean_squared_error(y, y_predict))
print("随机森林回归的平均绝对误差为:", mean_absolute_error(y, y_predict))
线形回归筛选27个变量,预测结果:
随机森林回归的默认评估值为: 0.9749813299237589
随机森林回归的R_squared值为: 0.9749813299237589
随机森林回归的均方误差为: 0.02421440105263158
随机森林回归的平均绝对误差为: 0.10688171745152354
决策树筛选18个变量,预测结果:
随机森林回归的默认评估值为: 0.9759216030226235
随机森林回归的R_squared值为: 0.9759216030226235
随机森林回归的均方误差为: 0.02330435468144044
随机森林回归的平均绝对误差为: 0.10703961218836565
决策树筛选能提高一些精度。
#test数据集上的拟合情况
#对test数据集进行变换
X_test_new = model.transform(data_test)
print(X_test_new.shape)
#拟合结果导出
y_test_predict =pd.DataFrame(rfr.predict(X_test_new)/10)
print(y_test_predict)
y_test_predict.to_csv(output_file, index=False)
自己运行代码走了一遍,刚看了几个大佬的视频分享,存在以下几个问题:
1、原有数据的分布特征未弄明白。(1)V5变量在训练集和测试集上的分布完全不一样,有可能导致存在过拟合。该变量处理应考虑筛除。(2)变量之间的相关性特征分析需补充考虑
2、数据kfolds交叉验证。一开始未考虑进去,后期需进一步修正。
3、不同的预测方法对比。各类方法应都分析看看。
4、集成算法应用。将各类算法进行组合,以提高预测精度。
本次训练的目的重点是如何来完善数据分析的思路,进一步得到提高。完整的将数据走一遍,打call,继续努力。
最终成绩果然不怎么样,果然是对样本过拟合了。
分数不佳,再接再厉哈。
第一次导入的时候,应该是txt的格式不对,所以没有记录上成绩。