机器学习12种模型代码
- 计算机科学
- 2024-01-14
- 414热度
- 0评论
每次输入数据之前记得打印一下数据看是不是读入正确了
0、BMA方法代码
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
# 生成示例数据
X = np.random.rand(100, 1) # 特征
y = 2 * X.squeeze() + np.random.randn(100) # 目标变量
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 定义候选模型集合
models = [
LinearRegression(),
DecisionTreeRegressor(max_depth=3)
]
# 训练候选模型
for model in models:
model.fit(X_train, y_train)
# 计算模型权重(简单均匀权重)
weights = np.ones(len(models)) / len(models)
# 预测结果融合(回归问题,加权平均)
y_pred = np.zeros_like(y_test)
for model, weight in zip(models, weights):
y_pred += weight * model.predict(X_test)
# 打印预测结果
print("Ensemble prediction:", y_pred)
00 模型进行网格搜索代码
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import Ridge
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import GridSearchCV
# 创建多项式回归模型
model = make_pipeline(PolynomialFeatures(), Ridge())
# 定义超参数的候选值
param_grid = {
'polynomialfeatures__degree': [2, 3, 4], # 多项式的阶数
'ridge__alpha': [0.1, 1.0, 10.0] # 正则化参数
}
# 创建网格搜索对象
grid_search = GridSearchCV(model, param_grid, cv=5)
# 在训练集上进行网格搜索
grid_search.fit(X_train, y_train)
# 输出最佳超参数组合
print("Best parameters: ", grid_search.best_params_)
# 使用最佳超参数的模型进行预测
y_pred = grid_search.predict(X_test)
1、训练测试集划分
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1786, random_state=42)
# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 预测结果
y_pred = model.predict(X_test)
# 计算R2
r2 = r2_score(y_test, y_pred)
# 计算MSE
mse = mean_squared_error(y_test, y_pred)
# 计算RMSE
rmse = np.sqrt(mse)
#计算MAE
mae = mean_absolute_error(y_test, y_pred)
# 打印结果
print("R2:", r2)
print("MAE:", mae)
print("MSE:", mse)
print("RMSE:", rmse)
2、线性回归模型
from sklearn.metrics import r2_score, mean_squared_error
#超参数
model = LinearRegression(fit_intercept=True, normalize=False, copy_X=True)
fit_intercept
(默认为True):指定是否计算截距。如果设置为False,则模型不会计算截距,直线将通过原点。normalize
(默认为False):指定是否对输入特征进行标准化。如果设置为True,则模型会对输入特征进行标准化,使其具有零均值和单位方差。copy_X
(默认为True):指定是否复制输入特征。如果设置为False,则模型会直接对输入特征进行操作,可能会修改原始数据。
3、逻辑回归(logistic regression)
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(penalty='l2', C=1.0, fit_intercept=True, solver='lbfgs', max_iter=100)
penalty
:用于指定正则化类型的惩罚项。可以选择的值包括'l1'
(L1正则化)、'l2'
(L2正则化)和'none'
(无正则化)。C
:正则化强度的倒数,控制正则化的力度。较小的C
值表示较强的正则化,较大的C
值表示较弱的正则化。fit_intercept
(默认为True):指定是否计算截距。如果设置为False,则模型不会计算截距。solver
:用于指定优化算法的求解器。可以选择的值包括'newton-cg'
、'lbfgs'
、'liblinear'
、'sag'
和'saga'
。max_iter
:最大迭代次数,用于控制优化算法的迭代次数。
4、多项式回归
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
# 创建多项式回归模型
degree = 2 # 多项式的阶数
model = make_pipeline(PolynomialFeatures(degree), Ridge(alpha))
# 训练模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
多项式回归中有几个重要的超参数需要考虑,除了多项式的阶数(degree
)之外,还有正则化参数(alpha
)和特征选择参数。
- 多项式的阶数(
degree
):多项式回归中,阶数决定了多项式的复杂度。较高的阶数可以更好地拟合非线性关系,但也容易引入过拟合。因此,需要通过交叉验证等方法来选择合适的阶数。 - 正则化参数(
alpha
):在多项式回归中,正则化可以帮助控制模型的复杂度,避免过拟合。正则化参数(如岭回归中的alpha
)用于调整正则化的强度。较大的alpha
值会增加正则化的影响,降低模型的复杂度。 - 特征选择参数:在多项式回归中,可以使用特征选择方法来选择合适的特征子集。例如,可以使用L1正则化(如Lasso回归)来鼓励模型选择重要的特征,从而降低模型的复杂度。
5. LASSO
LASSO(最小绝对收缩和选择算子)通过增加L1正则化来对回归系数进行惩罚,从而实现特征选择和模型稀疏性
from sklearn.linear_model import Lasso
# 创建 LASSO 模型
model = Lasso(alpha=0.1) # 在这里指定 alpha 值
model.fit(X_train,y_train)
y_pred = model.predict(X_test)
lasso_model = model
e_p(y_test, X_test)
6. DT
from sklearn.tree import DecisionTreeRegressor
# 创建决策树回归模型
model = DecisionTreeRegressor(max_depth= 7, min_samples_split=5)
# 在训练集上拟合模型
model.fit(X_train, y_train)
dt_model = model
e_p(y_train,X_train)
print(' ')
e_p(y_test, X_test)
7. KNR
from sklearn.svm import SVR
# 创建SVR模型
svr_model = SVR(kernel='rbf', random_state=42)
# 在训练集上训练模型
model.fit(X_train, y_train)
svr_model = model
e_p(y_train,X_train)
print(' ')
e_p(y_test, X_test)
8. MLP
from sklearn.neural_network import MLPRegressor
# 创建MLP回归器模型
model = MLPRegressor(hidden_layer_sizes=(10,), activation='tanh', solver='sgd' ,random_state=42,max_iter=5000)
# 在训练集上训练模型
model.fit(X_train, y_train)
mlpr_model = model
e_p(y_train,X_train)
print(' ')
e_p(y_test, X_test)
9.RFR
from sklearn.ensemble import RandomForestRegressor
# 创建MLP回归器模型
model = RandomForestRegressor()
# 在训练集上训练模型
model.fit(X_train, y_train)
rfr_model = model
e_p(y_train,X_train)
print(' ')
e_p(y_test, X_test)
10.XGB
import xgboost as xgb
# 定义XGBoost回归模型
model = xgb.XGBRegressor(n_estimators=100,learning_rate=0.1,max_depth=3,objective='reg:squarederror',random_state=42)
# 在训练集上训练模型
model.fit(X_train, y_train)
xgb_model = model
e_p(y_train,X_train)
print(' ')
e_p(y_test, X_test)
11.GBDT-D(Gradient Boosting with Dropout)
import xgboost as xgb
# 创建一个GBDT-D模型
params = {'objective': 'binary:logistic',
'tree_method': 'gpu_hist',
'eval_metric': 'logloss',
'dropout_rate': 0.1} # 设置dropout率
num_boost_round = 100
dtrain = xgb.DMatrix(X_train, label=y_train)
# 训练模型
model = xgb.train(params, dtrain, num_boost_round)
# 使用模型进行预测
dtest = xgb.DMatrix(X_test)
pred = model.predict(dtest)
12.DART (Dropout Additive Regression Trees)
DART(Dropout Additive Regression Trees)是一种基于决策树的集成学习方法,它结合了随机性和集成思想,用于回归问题。
DART是通过对每个基础决策树中的节点应用dropout技术来引入随机性的。具体而言,在每次训练过程中,随机选择一部分节点,并将它们从当前树的构建过程中删除,这样剩下的树就会变得更加矮且宽,每个节点的分支也会减少。这种节点的随机删除过程可以增加模型的多样性,并减少过拟合的风险。
除了应用dropout,DART还使用了Boosting思想。Boosting是通过迭代地训练多个弱模型,然后将它们按一定规则进行组合,以构建一个更强大的集成模型。DART采用了加性模型(Additive Model)的方法,每个基础决策树都在之前树的预测结果基础上进行训练,以逐步提升模型性能。
import xgboost as xgb
# 创建一个DART模型
params = {'objective': 'binary:logistic',
'tree_method': 'gpu_hist',
'eval_metric': 'logloss',
'rate_drop': 0.1, # 设置dropout概率
'sample_type': 'uniform', # 随机丢弃树节点的策略
'normalize_type': 'forest'} # 归一化计算出的权重
num_boost_round = 100
dtrain = xgb.DMatrix(X_train, label=y_train)
# 训练模型
model = xgb.train(params, dtrain, num_boost_round)
# 使用模型进行预测
dtest = xgb.DMatrix(X_test)
pred = model.predict(dtest)
13.Regularized Gradient Boosting
Regularized Gradient Boosting(正则化梯度提升)是一种集成学习方法,结合了梯度提升(Gradient Boosting)和正则化技术,用于解决回归和分类问题。
梯度提升是一种迭代的集成学习技术,通过逐步构建一系列弱学习器(通常是决策树),每个学习器都试图纠正前面学习器的错误。梯度提升通过梯度下降来最小化损失函数,每一轮迭代都构建一个新的模型来拟合当前残差。最终,所有模型的预测结果加权相加形成最终的集成模型。
正则化是一种用于控制模型复杂度的技术,旨在降低模型过拟合的风险。在正则化梯度提升中,常用的正则化技术包括L1正则化(Lasso)和L2正则化(Ridge)。
- L1正则化(Lasso)通过在损失函数中增加L1范数惩罚,鼓励模型权重稀疏化,从而选取最重要的特征进行建模,同时可以减少冗余特征的影响。
- L2正则化(Ridge)通过在损失函数中增加L2范数惩罚,使得模型权重尽可能小,防止模型对训练数据的噪声过敏。L2正则化还可以提高模型的泛化能力。