天池大赛------工业蒸汽量预测(初学者专用,简单易懂)

1.导包

# 警告不输出
import warnings
warnings.filterwarnings('ignore')

import numpy as np

import pandas as pd

from scipy import stats

import matplotlib.pyplot as plt
%matplotlib inline

import seaborn as sns

from sklearn.linear_model import LinearRegression,Lasso,Ridge,RidgeCV,ElasticNet

from sklearn.neighbors import KNeighborsRegressor

from sklearn.ensemble import GradientBoostingRegressor,RandomForestRegressor,AdaBoostRegressor,ExtraTreesRegressor

from xgboost import XGBRegressor

from lightgbm import LGBMRegressor

# 支持向量机
from sklearn.svm import SVR

from sklearn.metrics import mean_squared_error

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import MinMaxScaler,StandardScaler,PolynomialFeatures

2.加载数据及特征探索

2.1数据聚合
train = pd.read_csv('./zhengqi_train.txt',sep='\t')
test = pd.read_csv('./zhengqi_test.txt',sep='\t')

train['origin'] = 'train'
test['origin'] = 'test'

data_all = pd.concat([train,test])

print(data_all.shape)
data_all.head()

在这里插入图片描述

2.2特征探索
# 总共有28个特征,将不重要的特征就行筛选、删除
# 查看特征分布情况,将训练和测试中分布不均匀的同一特征进行筛选。、删除
plt.figure(figsize=(9,38 * 6))

for i,col in enumerate(data_all.columns[:-2]):
    
    cond_train = data_all['origin'] == 'train'
    train_col = data_all[col][cond_train]  # 训练数据
    
    cond_test = data_all['origin'] == 'test'
    test_col = data_all[col][cond_test]  # 测试数据
    
    axes = plt.subplot(38,1,i+1)
    ax = sns.kdeplot(train_col,shade = True,ax = axes)
    sns.kdeplot(test_col,shade = True,ax = ax)
    plt.legend(['train','test'])
    plt.xlabel(col)

在这里插入图片描述

# 绘制分布图
plt.figure(figsize=(9,38 * 6))
for col in data_all.columns[:-2]:
    g = sns.FacetGrid(data_all,col='origin')
    g.map(sns.distplot,col)

在这里插入图片描述

# 观察所画图形,筛选出要删除的特征
drop_labels = ["V5","V9","V11","V17","V22","V28"] 

data_all.drop(drop_labels,axis=1,inplace=True)
2.3相关系数
# 相关性系数corr
corr = data_all.corr()

# 通过相关性系数,找到7个相关性不大的特征
cond = corr.loc['target'].abs() < 0.15

drop_labels = corr.loc['target'].index[cond]

drop_labels
# 查看了属性的分布,将分布不好的进行删除
drop_labels = ['V14','V21','V19','V35',]
data_all.drop(drop_labels,axis=1,inplace=True)
# 找出相关程度
plt.figure(figsize=(20, 16))  # 指定绘图对象宽度和高度
mcorr = train.corr()  # 相关系数矩阵,即给出了任意两个变量之间的相关系数
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)  # 设置颜色
g = sns.heatmap(mcorr, mask=mask, cmap=cmap, square=True, annot=True, fmt='0.2f')  # 热力图(看两两相似度)
plt.show()

在这里插入图片描述

3.数据处理

3.1标准化操作
# 查看数据信息
data_all[data_all['origin'] == 'train'].describe()

在这里插入图片描述

data_all[data_all['origin'] == 'test'].describe()

在这里插入图片描述

stand = StandardScaler()

# 获取数据
data = data_all.iloc[:,:-2]

data2 = stand.fit_transform(data)
data2

在这里插入图片描述

cols = data_all.columns
data_all_std = pd.DataFrame(data2,columns=cols[:-2])

data_all.index = np.arange(4813)
data_all

在这里插入图片描述

data_all_std = pd.merge(data_all_std,data_all.iloc[:,-2:],right_index=True,left_index=True)
data_all_std

在这里插入图片描述

data_all_std.describe()

在这里插入图片描述

3.2过滤异常值
# 查找异常值

ridge = RidgeCV(alphas=[0.0001,0.001,0.01,0.1,0.2,0.5,1,2,3,4,5,10,20,30,50])

cond = data_all_std['origin'] == 'train'

X_train = data_all_std[cond].iloc[:,:-2]

y_train = data_all_std[cond]['target'] #真实值

ridge.fit(X_train,y_train)  # 算法拟合数据,结果不可能100%完全拟合

#进行数据预测,与真实值进行比较,将差距大的值进行筛选,删除
y_ = ridge.predict(X_train)  #预测值


cond = (y_train - y_).abs() > y_train.std() * 0.9


plt.figure(figsize=(12,6))

axes = plt.subplot(1,3,1)
axes.scatter(y_train,y_)
axes.scatter(y_train[cond],y_[cond],c = 'red',s = 20)

axes = plt.subplot(1,3,2)
axes.scatter(y_train,y_train - y_)
axes.scatter(y_train[cond],(y_train - y_)[cond],c = 'red',s = 20)

axes = plt.subplot(1,3,3)
(y_train - y_).plot.hist(bins = 50,ax = axes)
(y_train - y_).loc[cond].plot.hist(bins = 50,ax = axes,color = 'red')


# 将异常值过滤
drop_index = cond[cond].index

data_all_std.drop(drop_index,axis = 0,inplace=True)

在这里插入图片描述

3.3归一化处理
data = data_all.iloc[:,:-2]

minmaxscaler = MinMaxScaler()

data3 = minmaxscaler.fit_transform(data)


# 归一化的数据
data_all_norm = pd.DataFrame(data3,columns=data_all.columns[:-2])

data_all_norm = pd.merge(data_all_norm,data_all.iloc[:,-2:],left_index= True,right_index=True)


def scale_minmax(data):
    return (data - data.min())/(data.max() - data.min())
    
    
fcols = 6
frows = len(data_all_norm.columns[:10])
plt.figure(figsize=(4*fcols,4*frows))
i=0

for col in data_all_norm.columns[:10]:
    dat = data_all_norm[[col, 'target']].dropna()

#     这条线就是数据分布dist:distribution(分布)
    i+=1
    plt.subplot(frows,fcols,i)
    sns.distplot(dat[col],fit = stats.norm);
    plt.title(col+' Original')
    plt.xlabel('')

#     第二个图:skew统计分析中中一个属性
#     skewness 偏斜系数,对正太分布的度量
    i+=1
    plt.subplot(frows,fcols,i)
    _=stats.probplot(dat[col], plot=plt)#画图,偏析度
    plt.title('skew='+'{:.4f}'.format(stats.skew(dat[col])))
    plt.xlabel('')
    plt.ylabel('')

#     散点图
    i+=1
    plt.subplot(frows,fcols,i)
#     plt.plot(dat[var], dat['target'],'.',alpha=0.5)
    plt.scatter(dat[col],dat['target'],alpha=0.5)
    plt.title('corr='+'{:.2f}'.format(np.corrcoef(dat[col], dat['target'])[0][1]))

#     !!!对数据进行了处理!!!
#   数据分布图distribution
    i+=1
    plt.subplot(frows,fcols,i)
    trans_var, lambda_var = stats.boxcox(dat[col].dropna()+1)
    trans_var = scale_minmax(trans_var)      
    sns.distplot(trans_var , fit=stats.norm);
    plt.title(col+' Tramsformed')
    plt.xlabel('')

#     偏斜度
    i+=1
    plt.subplot(frows,fcols,i)
    _=stats.probplot(trans_var, plot=plt)
    plt.title('skew='+'{:.4f}'.format(stats.skew(trans_var)))
    plt.xlabel('')
    plt.ylabel('')

#     散点图
    i+=1
    plt.subplot(frows,fcols,i)
    plt.plot(trans_var, dat['target'],'.',alpha=0.5)
    plt.title('corr='+'{:.2f}'.format(np.corrcoef(trans_var,dat['target'])[0][1]))

在这里插入图片描述

# 将数据进行Box-Cox转换
# 统计建模中常用的数据变化
# 数据更加正态化,标准化
for col in data_all_norm.columns[:-2]:
    boxcox,maxlog = stats.boxcox(data_all_norm[col] + 1)
    data_all_norm[col] = scale_minmax(boxcox)
    
    
fcols = 6
frows = len(data_all_norm.columns[:10])
plt.figure(figsize=(4*fcols,4*frows))
i=0

for col in data_all_norm.columns[:10]:
    dat = data_all_norm[[col, 'target']].dropna()

#     这条线就是数据分布dist:distribution(分布)
    i+=1
    plt.subplot(frows,fcols,i)
    sns.distplot(dat[col],fit = stats.norm);
    plt.title(col+' Original')
    plt.xlabel('')

#     第二个图:skew统计分析中中一个属性
#     skewness 偏斜系数,对正太分布的度量
    i+=1
    plt.subplot(frows,fcols,i)
    _=stats.probplot(dat[col], plot=plt)#画图,偏析度
    plt.title('skew='+'{:.4f}'.format(stats.skew(dat[col])))
    plt.xlabel('')
    plt.ylabel('')

#     散点图
    i+=1
    plt.subplot(frows,fcols,i)
#     plt.plot(dat[var], dat['target'],'.',alpha=0.5)
    plt.scatter(dat[col],dat['target'],alpha=0.5)
    plt.title('corr='+'{:.2f}'.format(np.corrcoef(dat[col], dat['target'])[0][1]))

#     !!!对数据进行了处理!!!
#   数据分布图distribution
    i+=1
    plt.subplot(frows,fcols,i)
    trans_var, lambda_var = stats.boxcox(dat[col].dropna()+1)
    trans_var = scale_minmax(trans_var)      
    sns.distplot(trans_var , fit=stats.norm);
    plt.title(col+' Tramsformed')
    plt.xlabel('')

#     偏斜度
    i+=1
    plt.subplot(frows,fcols,i)
    _=stats.probplot(trans_var, plot=plt)
    plt.title('skew='+'{:.4f}'.format(stats.skew(trans_var)))
    plt.xlabel('')
    plt.ylabel('')

#     散点图
    i+=1
    plt.subplot(frows,fcols,i)
    plt.plot(trans_var, dat['target'],'.',alpha=0.5)
    plt.title('corr='+'{:.2f}'.format(np.corrcoef(trans_var,dat['target'])[0][1]))

在这里插入图片描述

3.4再次过滤异常值
ridge = RidgeCV(alphas=[0.0001,0.001,0.01,0.1,0.2,0.5,1,2,3,4,5,10,20,30,50])

cond = data_all_norm['origin'] == 'train'

X_train = data_all_norm[cond].iloc[:,:-2]
# 真实值
y_train = data_all_norm[cond]['target']
# 算法拟合数据和目标值的时候,不可能100%拟合
ridge.fit(X_train,y_train)
# 预测,预测值肯定会和真实值有一定的偏差,偏差特别大,当成异常值
y_ = ridge.predict(X_train)

cond = abs(y_ - y_train) > y_train.std() * 0.9
print(cond.sum())
# 画图
plt.figure(figsize=(12,6))
axes = plt.subplot(1,3,1)
axes.scatter(y_train,y_)
axes.scatter(y_train[cond],y_[cond],c = 'red',s = 20)

axes = plt.subplot(1,3,2)
axes.scatter(y_train,y_train - y_)
axes.scatter(y_train[cond],(y_train - y_)[cond],c = 'red')

axes = plt.subplot(1,3,3)
# _ = axes.hist(y_train,bins = 50)
(y_train - y_).plot.hist(bins = 50,ax = axes)
(y_train - y_).loc[cond].plot.hist(bins = 50,ax = axes,color = 'r')


index = cond[cond].index

data_all_norm.drop(index,axis = 0,inplace=True)

在这里插入图片描述

4预测数据

estimators = {}
# estimators['forest'] = RandomForestRegressor(n_estimators=300)
# estimators['gbdt'] = GradientBoostingRegressor(n_estimators=300)
estimators['ada'] = AdaBoostRegressor(n_estimators=300)
estimators['extreme'] = ExtraTreesRegressor(n_estimators=300)
estimators['svm_rbf'] = SVR(kernel='rbf')
# estimators['light'] = LGBMRegressor(n_estimators=300)
# estimators['xgb'] = XGBRegressor(n_estimators=300)



cond = data_all_norm['origin'] == 'train'
X_train = data_all_norm[cond].iloc[:,:-2]
y_train = data_all_norm[cond]['target']

cond = data_all_norm['origin'] == 'test'
X_test = data_all_norm[cond].iloc[:,:-2]



# 一个算法预测结果,将结果合并
result = []
for key,model in estimators.items():
    model.fit(X_train,y_train)
    y_ = model.predict(X_test)
    if key == 'svm_rbf':
        result.append(y_)
    result.append(y_)

y_ = np.mean(result,axis = 0)    



# 将预测结果y_加入到test的target中,把所有数据当做整体多次学习预测
data_all_norm.set_index(np.arange(data_all_norm.shape[0]),inplace=True)
for i in range(30):
    cond = data_all_norm['origin'] == 'train'
    train_target = list(data_all_norm[cond]['target'])
    test_target = list(y_)
    target_all = train_target + test_target
    target_all = pd.Series(target_all)
    
    data_all_norm = data_all_norm.drop(['target'],axis = 1)
    data_all_norm['target'] = target_all
    
    X_train = data_all_norm.iloc[:,:-2]
    y_train = data_all_norm['target']

    cond = data_all_norm['origin'] == 'test'
    X_test = data_all_norm[cond].iloc[:,:-2]
    
    result = []
    for key,model in estimators.items():
        model.fit(X_train,y_train)
        y_ = model.predict(X_test)
        if key == 'svm_rbf':
            result.append(y_)
        result.append(y_)

    y_ = np.mean(result,axis = 0)

pd.Series(y_).to_csv('./predict.txt',index=False)

5.提交结果

去官网进行提交

工业蒸汽预测

在这里插入图片描述

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值