蒸汽新人比赛代码,使用LGB(学习)

这是第一次写数据挖掘的学习笔记

该类博客的初衷:

经历实验室项目的初体验,做的是数据预处理、特征工程之类的事情。自己还是一个菜鸟,什么都不会也不太明白,做起来很盲目无从下手,最终的结果也是不理想。不得不自己想点办法,看到自己的不足需要学习很多数据挖掘和机器学习的知识。为了以后再做实验室项目不那么慌张,为了对得起学术型研究生这个称号,:中鸭!!

赛题背景

火力发电的基本原理是:燃料在燃烧时加热水生成蒸汽,蒸汽压力推动汽轮机旋转,然后汽轮机带动发电机旋转,产生电能。在这一系列的能量转化中,影响发电效率的核心是锅炉的燃烧效率,即燃料燃烧加热水产生高温高压蒸汽。锅炉的燃烧效率的影响因素很多,包括锅炉的可调参数,如燃烧给量,一二次风,引风,返料风,给水水量;以及锅炉的工况,比如锅炉床温、床压,炉膛温度、压力,过热器的温度等。

赛题描述

经脱敏后的锅炉传感器采集的数据(采集频率是分钟级别),根据锅炉的工况,预测产生的蒸汽量。

源代码地址:https://tianchi.aliyun.com/notebook/detail.html?spm=5176.11409386.0.0.60a51d070HoVWk&id=36153

特征处理方式:

交叉特征,即简单的成对交互特征是两个特征的积。类似逻辑与。这使我们能够捕获特征之间的相互影响,因此它们被称为交互特征。构造交互特征非常简单,但它们使用起来很昂贵。使用成对交互特征的线性模型的训练和得分时间将从O(n)到O(n2),其中n是单身特征的数量。

本次实验特征不算很多,一共现有38个特征,可以选择所有的特征进行成对交互。

对于大数量的特征,可以在所有交互特征之上执行特征选择,选择前几个。或者可以更仔细地制作更少数量的复杂特征。

1. 首先是导入数据,并添加标签

# 导入数据
zhengqi_train = pd.read_table('./zhengqi_train.txt',encoding='utf-8')
zhengqi_test = pd.read_table('./zhengqi_test.txt',encoding='utf-8')

#添加label
zhengqi_train["label"] = 1
zhengqi_train['label'] = zhengqi_train['label'].apply(lambda x:int(x))

2. 采用交叉特征方式添加特征,交叉的方式只是单纯的求和。

#添加特征
#这里做了一个简单特征扩展,让现有38个特征互相叠加。每个特征和其他37个特征直接相加
items = []
for i in range(38):
    v = 'V'+str(i)
    items.append(v)
# print(items)
 
for i in range(len(items)):
    for j in range(i+1,len(items)):
        temp = zhengqi_train[items[i]]+zhengqi_train[items[j]]
        zhengqi_train[items[i]+'_'+items[j]] = temp
zhengqi_train_ = zhengqi_train.drop(items,axis = 1)

3. 未降维的数据划分,分为输入数据和输出数据。

# 数据分割
X = np.array(zhengqi_train.drop(['target'], axis = 1))
y = np.array(zhengqi_train.target)
 
print('================================')
print(X.shape)
print(y.shape)
print('================================')
 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
print(len(X_train))
print(len(X_test))

4. 数据降维,防止过拟合。

采用随机森林回归,基于树的三种集成回归模型RandomForestRegressor,ExtraTreesRegressor以及GradientBoostingRegressor。

参考资料:https://blog.csdn.net/jiede1/article/details/78245597/

普通的随机森林模型构建的分裂节点时是随机选取特征的,极端随机森林构建每一棵树的分裂节点时,不会任意的选取特征,而是先随机收集一部分特征,然后利用信息熵/基尼指数挑选最佳的节点特征

# 数据降维
# 现在数据有700多个特征太多了会过拟合,需要降维
# 使用的默认参数,后面要调参
X.shape
clf = ExtraTreesRegressor()
clf = clf.fit(X, y)
 
model = SelectFromModel(clf, prefit=True,)
X_new = model.transform(X)
X_new.shape

5. 数据降维后的数据划分,进行 lightGBM调参。

# 数据划分
X_train_new, X_test_new, y_train, y_test = train_test_split(X_new, y, test_size=0.3, random_state=0)
 
params = {
    'boosting_type': 'gbdt',
    'objective': 'regression',
    'metric': 'mse',
    'num_leaves': 32,
    'learning_rate': 0.05,
    'feature_fraction': 0.9,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'verbose': 1
}

6. 使用LightGBM进行训练,学习地址:http://lightgbm.apachecn.org/cn/latest/index.html

# 使用LightGBM
xx_submit = []
lgb_train = lgb.Dataset(X_train_new, y_train)
gbm = lgb.train(params,
                lgb_train,
                num_boost_round=5000,
                verbose_eval=50,
                )
xx_submit.append(gbm.predict(X_test_new, num_iteration=gbm.best_iteration))

猜你喜欢

转载自blog.csdn.net/qq_32805671/article/details/84147415
lgb
今日推荐