蒸汽预测赛题——模型训练
天池大赛比赛地址:链接
理论知识
-
回归用在目标数量连续时预测
-
线性回归模型 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进行限制,类似于DFS。XGBoost中同一层节点都分裂,最后剪枝,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