蒸汽预测赛题——模型训练

天池大赛比赛地址:链接

理论知识

  • 回归用在目标数量连续时预测

  • 线性回归模型 LinearRegression

    • 假定因变量Y和自变量X呈线性相关 可以用Y=AX+b X是权重

    • from sklearn.metrics import mean_squared_error
      from sklearn.linear_model import LinearRegression
      clf = LinearRegression()
      clf.fit(trainX,trainY)
      score = mean_squared_error(testY,clf.predict(testX))
      
  • K近邻回归 KNeighborsRegressor

    • 可以用于分类和回归,通过找到样本的k个最近邻居,把邻居的某些属性的平均值赋给该样本

    • 欧式距离

    • from sklearn.neighbors import KNeighborsRegressor
      clf = KNeighborsRegressor(n_neighbors=3)
      clf.fit(trainX,trainY)
      score = mean_squared_error(testY,clf.predict(testX))
      
  • 决策树回归模型 DecisionTreeRegression

    • 根据一定准则,将一个空间划分成若干个子空间,按照特征将测试数据归到某个子空间

    • 对于分割点的选择可以 最小二乘法、基尼系数、信息增益、信息增益比

    • 参考链接

      from sklearn.tree import DecisionTreeRegression
      clf = DecisionTreeRegression()
      
  • 集成学习 ensemble

    • 随机森林就是通过集成学习的思想将多棵树集成的一种算法,基本单元是决策树

    • 回归问题中,随机森林输出所有决策树输出的平均值

    • 优点:

      • 准确率高
      • 能够运行在大数据集上
      • 能够处理具有高维特征的输入样本,且不需要降维
      • 能够评估各个特征在分类问题上的重要性
      • 在生成过程中能够获取到内部生成误差的一种无偏估计
      • 对于缺失值问题也有比较好结果
    • from sklearn.ensemble import RandomForestRegressor
      clf = RandomForestRegressor(n_estimators=200)
      
  • LightGBM回归模型

    • GBDT算法框架 支持高效率并行训练
    • 把连续的浮点特征值离散化为K个整数,同时构造一个宽度为K的直方图。遍历数据时,将离散化后的值作为索引在直方图中累积统计量,根据直方图的离散值遍历寻找最优的分割点
    • 减少内存占用,离散为256bin时,只需8bit
    • 减少在split finding计算增益时的计算量,O(#data)---->O(#bins)
    • 直方图做差加速
      • 叶子的直方图可由父节点的直方图和兄弟节点的直方图做差得到
      • 构造直方图通常需要遍历叶子上的所有数据,直方图做差仅需遍历直方图的K个桶
    • 建树过程:选取有最大增益的节点分裂,容易过拟合,max_depth进行限制,类似于DFSXGBoost中同一层节点都分裂,最后剪枝,BFS。
    • 特征并行
      • 垂直切分数据,每个worker只有部分特征,每个worker在找到局部最佳分割点后 进行节点间的相互通信找到全局最佳分割点,然后在全局最佳分割特征的worker上进行节点分裂,最后对得到的左右子树的实例节点进行广播,其他节点根据广播的实例继续分裂。
      • 缺点:在split finding过程中存在计算复杂度过高
      • LightGBM中特征并行:每个worker保存所有数据集,在其特征子集上寻找分割点,worker间相互通信,避免广播 instance indices,减少网络通信量;但计算复杂度没减少
    • 数据并行
      • 水平切分数据,每个worker根据本地数据统计局部直方图,然后合并得到全局直方图,在根据全局直方图进行节点分裂
      • 缺点:存在网络通信代价巨大的问题,点对点通信O(#machine * #feature * #bin),集合通信算法O(2 * #feature * #bin)
      • LightGBM中数据并行:不同的worker合并不同特征的局部直方图,采用直方图做差,通信量为O(0.5 * #feature * #bin)

1. 导入相关库

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.decomposition import PCA
from sklearn.preprocessing import MinMaxScaler
import pandas as pd

2. 导入数据

train_data_file = "../datasets/zhengqi_train.txt"
test_data_file = "../datasets/zhengqi_test.txt"

train_data = pd.read_csv(train_data_file, sep='\t', encoding='utf-8')
test_data = pd.read_csv(test_data_file, sep='\t', encoding='utf-8')

feature_columns = [col for col in train_data if col not in ['target']]

min_max_scaler = MinMaxScaler().fit(train_data[feature_columns])
train_data_scaler = min_max_scaler.transform(train_data[feature_columns])
test_data_scaler = min_max_scaler.transform(test_data[feature_columns])
train_data_scaler = pd.DataFrame(train_data_scaler,columns=feature_columns)
train_data_scaler['target'] = train_data['target']
test_data_scaler = pd.DataFrame(test_data_scaler,columns=feature_columns)

pca = PCA(n_components=16)
new_train_pca_16 = pca.fit_transform(train_data_scaler.iloc[:,:-1])
new_train_pca_16 = pd.DataFrame(new_train_pca_16)
new_train_pca_16['target'] = train_data_scaler['target']
new_test_pca_16 = pca.transform(test_data_scaler)
new_test_pca_16 = pd.DataFrame(new_test_pca_16)

train= new_train_pca_16.fillna(0)[new_test_pca_16.columns]
target = new_train_pca_16['target']

3. 切分数据

train_data,test_data,train_target,test_target = 
train_test_split(train,target,test_size=0.2,random_state=0)

4. 多元线性回归 LinearRegression

from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LinearRegression
clf = LinearRegression()
clf.fit(train_data,train_target)
score = mean_squared_error(test_target,clf.predict(test_data))
print("Lineargegression: ",score)

# Lineargegression:  0.14190269339646494

5. K近邻回归 KNeighborsRegressor

from sklearn.metrics import mean_squared_error
from sklearn.neighbors import KNeighborsRegressor
clf = KNeighborsRegressor(n_neighbors=8)
clf.fit(train_data,train_target)
score = mean_squared_error(test_target,clf.predict(test_data))
print("KNeighborsRegressor: ",score)

# KNeighborsRegressor:  0.19676791854995673

6. 随机森林回归 RandomForestRegressor

from sklearn.metrics import mean_squared_error
from sklearn.ensemble import RandomForestRegressor
clf = RandomForestRegressor(n_estimators=200)
clf.fit(train_data,train_target)
score = mean_squared_error(test_target,clf.predict(test_data))
print("RandomForestRegressor: ",score)

# RandomForestRegressor:  0.15819761428775952

7. LGB模型回归 lightgbm

import lightgbm as lgb
clf = lgb.LGBMRegressor(
    learning_rate=0.01,
    max_depth=-1,
    n_estimators=2000,
    boosting_type='gbdt',
    random_state=2020,
    objective = 'regression',
)
clf.fit(X=train_data,y=train_target,eval_metric='MSE',verbose=50)
score = mean_squared_error(test_target,clf.predict(test_data))
print("lightGBM: ",score)

# lightGBM:  0.142261569451564
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值