- 线性回归模型
一元线性回归模型使用单一特征来预测响应值,拟合的最佳曲线通过最小化预测值和真实值之间的误差得到。
多元回归模型利用多个自变量估计因变量,从而解释和预测因变量的值
优点:模型简单。部署方便,回归权重可以用于结果分析,训练快
缺点:精度低,特征存在一定的共线性问题
使用技巧:需要进行归一化处理如特征选择,避免高度相关的特征同时存在
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LinearRegression
clf = LinearRegression()
clf.fit(train_data, train_target)
test_pred = clf.predict(test_data)
score = mean_squared_error(test_pred, test_target)
score
- K近邻回归模型
K近邻回归模型通过找出某个样本的k个最近邻居,将这些邻居的某个属性的平均值赋给该样本,就可以得到该样本对应属性的值。
优点:模型简单,易于理解,对于数据量小的情况方便快捷,可视化方便
缺点:计算量大,不适合数据量大的情况,需要调参数
使用技巧:特征需要归一化,重要特征可以适当加一定比例的权重
from sklearn.neighbors import KNeighborsRegressor
clf = KNeighborsRegressor(n_neighbors=3)
clf.fit(train_data, train_target)
test_pred = clf.predict(test_data)
score = mean_squared_error(test_pred, test_target)
score
- 决策树回归模型
决策树回归可以理解为根据一定规则,将一个空间划分为若干个子空间,然后利用子空间内所有点的信息表示这个子空间,对于测试数据,只要按照特征将其归到某个子空间,便可得到对应子空间的输出值。
from sklearn.tree import DecisionTreeRegressor
clf = DecisionTreeRegressor()
clf.fit(train_data, train_target)
test_pred = clf.predict(test_data)
score = mean_squared_error(test_pred, test_target)
score
- 随机森林回归模型
随机森林是通过集成学习的思想将多棵树集成的一种算法,基本单元是决策树,在回归问题中,随机森林输出所有决策树输出的平均值,随机森林回归模型的主要优点是在所有算法中,具有极好的准确率能够运行在大数据集上,能够处理高维特征的输入样本,而且不需要降维,能够评估各个特征在分类问题上的重要性,在生成过程中,能够获取到内部生成误差的一种无偏估计,对于缺省值也能获得很好的结果。
优点:使用方便,特征无需做过多变换,精度较高,模型并行效率块
缺点:结果不容易解释
使用技巧:参数调节,提高精度
from sklearn.ensemble import RandomForestRegressor
clf = RandomForestRegressor(n_estimators=100)
clf.fit(train_data, train_target)
test_pred = clf.predict(test_data)
score = mean_squared_error(test_target, test_pred)
score
- LightGBM回归模型
LightGBM支持高效率的并行训练,具有更快的训练速度、更低的内存消耗、更好的准确率、分布式支持、可以快速处理海量数据
优点:精度高
缺点:训练时间长,模型复杂
使用技巧:有效的验证集防止过拟合,参数搜索
import lightgbm as lgb
clf = lgb.LGBMRegressor(
learning_rate = 0.01,
max_depth = -1,
n_estimators = 5000,
boosting_type='gbdt',
random_state=2019,
objective='regression'
)
test_pred = clf.fit(train_data, train_target, eval_metric='MSE', verbose=50)
score = mean_squared_error(test_target, test_pred)
score
- 基于核的岭回归
folds = KFold(n_splits=5, shuffle=True, random_state=13)
oof_kr_383 = np.zeros(train_shape)
predictions_kr_383 = np.zeros(len(X_test_383))
for fold_, (trn_idx, val_idx) in enumerate(folds.split(X_train_383, y_train)):
print("fold n°{}".format(fold_+1))
tr_x = X_train_383[trn_idx]
tr_y = y_train[trn_idx]
#Kernel Ridge Regression 岭回归
kr_383 = kr()
kr_383.fit(tr_x,tr_y)
oof_kr_383[val_idx] = kr_383.predict(X_train_383[val_idx])
predictions_kr_383 += kr_383.predict(X_test_383) / folds.n_splits
print("CV score: {:<8.8f}".format(mean_squared_error(oof_kr_383, target)))
- 普通岭回归
folds = KFold(n_splits=5, shuffle=True, random_state=13)
oof_ridge_383 = np.zeros(train_shape)
predictions_ridge_383 = np.zeros(len(X_test_383))
for fold_, (trn_idx, val_idx) in enumerate(folds.split(X_train_383, y_train)):
print("fold n°{}".format(fold_+1))
tr_x = X_train_383[trn_idx]
tr_y = y_train[trn_idx]
#使用岭回归
ridge_383 = Ridge(alpha=1200)
ridge_383.fit(tr_x,tr_y)
oof_ridge_383[val_idx] = ridge_383.predict(X_train_383[val_idx])
predictions_ridge_383 += ridge_383.predict(X_test_383) / folds.n_splits
print("CV score: {:<8.8f}".format(mean_squared_error(oof_ridge_383, target)))
- 使用ElasticNet 弹性网络
folds = KFold(n_splits=5, shuffle=True, random_state=13)
oof_en_383 = np.zeros(train_shape)
predictions_en_383 = np.zeros(len(X_test_383))
for fold_, (trn_idx, val_idx) in enumerate(folds.split(X_train_383, y_train)):
print("fold n°{}".format(fold_+1))
tr_x = X_train_383[trn_idx]
tr_y = y_train[trn_idx]
#ElasticNet 弹性网络
en_383 = en(alpha=1.0,l1_ratio=0.06)
en_383.fit(tr_x,tr_y)
oof_en_383[val_idx] = en_383.predict(X_train_383[val_idx])
predictions_en_383 += en_383.predict(X_test_383) / folds.n_splits
print("CV score: {:<8.8f}".format(mean_squared_error(oof_en_383, target)))
- 使用BayesianRidge 贝叶斯岭回归
folds = KFold(n_splits=5, shuffle=True, random_state=13)
oof_br_383 = np.zeros(train_shape)
predictions_br_383 = np.zeros(len(X_test_383))
for fold_, (trn_idx, val_idx) in enumerate(folds.split(X_train_383, y_train)):
print("fold n°{}".format(fold_+1))
tr_x = X_train_383[trn_idx]
tr_y = y_train[trn_idx]
#BayesianRidge 贝叶斯回归
br_383 = br()
br_383.fit(tr_x,tr_y)
oof_br_383[val_idx] = br_383.predict(X_train_383[val_idx])
predictions_br_383 += br_383.predict(X_test_383) / folds.n_splits
print("CV score: {:<8.8f}".format(mean_squared_error(oof_br_383, target)))
LASSO回归
梯度提升树回归