机器学习:梯度提升算法 | Python 和 R 代码实现
梯度提升算法
10.1 GBM
GBM(梯度提升机)是一种提升类型,用于处理大量数据以创建高度预测的预测算法。 Boosting 实际上是一组学习算法,它结合了多个基本估计器的预测,以提高与单个估计器相比的鲁棒性。它将多个弱或平均预测变量组合成一个强预测变量。这些 boosting 算法在 Kaggle、AV Hackthon、CrowdAnalytix 等数据科学竞赛中总是表现出色。
Python代码
#Import Library
from sklearn.ensemble import GradientBoostingClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create Gradient Boosting Classifier object
model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)
R代码
library(caret)
x <- cbind(x_train,y_train)
# Fitting model
fitControl <- trainControl( method = "repeatedcv", number = 4, repeats = 4)
fit <- train(y ~ ., data = x, method = "gbm", trControl = fitControl,verbose = FALSE)
predicted= predict(fit,x_test,type= "prob")[,2]
梯度boost分类器和随机树分类器是两种不同的boosted树分类器,boosted树分类器你经常会问这两种算法之间的区别。
10.2 XGBOST
另一种经典的梯度增强算法,众所周知,是一些 Kaggle 比赛中的关键选择。
XGBoost 具有非常高的预测能力,使其成为事件准确性的最佳选择,因为它同时具有线性模型和树学习算法,使得该算法比现有梯度提升机技术快近 10 倍。
支持各种目标函数,包括回归、分类和排名。
XGBoost 最有趣的事情之一是它也被称为正式的 boosting 技术。这有助于减少建模中的过度定制,并为包括 Scala、Java、R、Python、Julia 和 C++ 在内的多种语言提供广泛的支持。
支持分布式大规模训练,包括 GCE、AWS、Azure 和 Yarn 集群等多种机器。 XGBoost 还可以与 Spark、Flink 和其他云数据流系统集成,并在提升过程的每次迭代中内置交叉验证。
要了解有关 XGBoost 和参数调整的更多信息,请访问 www..ticsvidhya.com/blog/2016/0...。
Python 代码:
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
X = dataset[:,0:10]
Y = dataset[:,10:]
seed = 1
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed)
model = XGBClassifier()
model.fit(X_train, y_train)
#Make predictions for test data
y_pred = model.predict(X_test)
R 语言代码
require(caret)
x <- cbind(x_train,y_train)
# Fitting model
TrainControl <- trainControl( method = "repeatedcv", number = 10, repeats = 4)
model<- train(y ~ ., data = x, method = "xgbLinear", trControl = TrainControl,verbose = FALSE)
OR
model<- train(y ~ ., data = x, method = "xgbTree", trControl = TrainControl,verbose = FALSE)
predicted <- predict(model, x_test)
10.3 LightGBM
LightGBM 是一个使用树学习算法的梯度提升框架。它采用分布式、高效的设计,具有以下优点:
- 训练速度更快,效率更高
- 内存消耗低
- 精度更高
- 支持 GPU 并行学习 能够进行大规模数据处理
该框架是一个基于决策树算法的快速高效的梯度提升框架,用于排序和分类等机器学习任务。它是作为 Microsoft 分布式机器学习工具包项目的一部分开发的。
由于LightGBM基于决策树算法,因此它根据叶子形状来分割树以达到最佳拟合,而其他改进算法则根据深度级别或方向而不是叶子形状来分割树。因此,在 lightGBM 中,当在同一片叶子上生长时,叶子算法能够比 level-wise 算法减少更多的损失,从而比任何现有的 boosting 算法有更好的精度。
他的速度也非常快,因此有了“轻”这个词。
通过本文了解有关 LightGBM 的更多信息:www..ticsvidhya.com/blog/2017/0...
Python 代码
data = np.random.rand(500, 10) # 500 entities, each contains 10 features
label = np.random.randint(2, size=500) # binary target
train_data = lgb.Dataset(data, label=label)
test_data = train_data.create_valid('test.svm')
param = {'num_leaves':31, 'num_trees':100, 'objective':'binary'}
param['metric'] = 'auc'
num_round = 10
bst = lgb.train(param, train_data, num_round, valid_sets=[test_data])
bst.save_model('model.txt')
# 7 entities, each contains 10 features
data = np.random.rand(7, 10)
ypred = bst.predict(data)
R 代码
library(RLightGBM)
data(example.binary)
#Parameters
num_iterations <- 100
config <- list(objective = "binary", metric="binary_logloss,auc", learning_rate = 0.1, num_leaves = 63, tree_learner = "serial", feature_fraction = 0.8, bagging_freq = 5, bagging_fraction = 0.8, min_data_in_leaf = 50, min_sum_hessian_in_leaf = 5.0)
#Create data handle and booster
handle.data <- lgbm.data.create(x)
lgbm.data.setField(handle.data, "label", y)
handle.booster <- lgbm.booster.create(handle.data, lapply(config, as.character))
#Train for num_iterations iterations and eval every 5 steps
lgbm.booster.train(handle.booster, num_iterations, 5)
#Predict
pred <- lgbm.booster.predict(handle.booster, x.test)
#Test accuracy
sum(y.test == (y.pred > 0.5)) / length(y.test)
#Save model (can be loaded again via lgbm.booster.load(filename))
lgbm.booster.save(handle.booster, filename = "/tmp/model.txt")
如果您知道 R 扩展包,还有什么方式实现LightGBM 的。
require(caret)
require(RLightGBM)
data(iris)
model <-caretModel.LGBM()
fit <- train(Species ~ ., data = iris, method=model, verbosity = 0)
print(fit)
y.pred <- predict(fit, iris[,1:4])
library(Matrix)
model.sparse <- caretModel.LGBM.sparse()
#Generate a sparse matrix
mat <- Matrix(as.matrix(iris[,1:4]), sparse = T)
fit <- train(data.frame(idx = 1:nrow(iris)), iris$Species, method = model.sparse, matrix = mat, verbosity = 0)
print(fit)
10.4 CatBoost
CatBoost 是俄罗斯最大搜索引擎公司 Yandex 的开源机器学习算法。它可以轻松地与谷歌的 Tensorflow 和苹果的 Core ML 等深度学习框架集成。
CatBoost 最好的一点是,它不需要像其他 ML 模型那样进行大量的数据训练,并且可以处理不同的数据格式;而不影响其稳健性。
确保在开始之前已处理丢失的数据。
CatBoost 可以自动处理 calcategori 变量,而不显示类型转换错误,帮助您专注于微调模型,而不是处理小错误。
您可以在本文中找到有关 Catboost 的更多信息:www-DistaSvIDHYA.COM/BLG/2017/08...
Python 代码
import pandas as pd
import numpy as np
from catboost import CatBoostRegressor
#Read training and testing files
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
#Imputing missing values for both train and test
train.fillna(-999, inplace=True)
test.fillna(-999,inplace=True)
#Creating a training set for modeling and validation set to check model performance
X = train.drop(['Item_Outlet_Sales'], axis=1)
y = train.Item_Outlet_Sales
from sklearn.model_selection import train_test_split
X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.7, random_state=1234)
categorical_features_indices = np.where(X.dtypes != np.float)[0]
#importing library and building model
from catboost import CatBoostRegressormodel=CatBoostRegressor(iterations=50, depth=3, learning_rate=0.1, loss_function='RMSE')
model.fit(X_train, y_train,cat_features=categorical_features_indices,eval_set=(X_validation, y_validation),plot=True)
submission = pd.DataFrame()
submission['Item_Identifier'] = test['Item_Identifier']
submission['Outlet_Identifier'] = test['Outlet_Identifier']
submission['Item_Outlet_Sales'] = model.predict(test)
R 语言代码
set.seed(1)
require(titanic)
require(caret)
require(catboost)
tt <- titanic::titanic_train[complete.cases(titanic::titanic_train),]
data <- as.data.frame(as.matrix(tt), stringsAsFactors = TRUE)
drop_columns = c("PassengerId", "Survived", "Name", "Ticket", "Cabin")
x <- data[,!(names(data) %in% drop_columns)]y <- data[,c("Survived")]
fit_control <- trainControl(method = "cv", number = 4,classProbs = TRUE)
grid <- expand.grid(depth = c(4, 6, 8),learning_rate = 0.1,iterations = 100, l2_leaf_reg = 1e-3, rsm = 0.95, border_count = 64)
report <- train(x, as.factor(make.names(y)),method = catboost.caret,verbose = TRUE, preProc = NULL,tuneGrid = grid, trControl = fit_control)
print(report)
importance <- varImp(report, scale = FALSE)
print(importance) 版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网