IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 13. 集成学习进阶二——lightGBM -> 正文阅读

[人工智能]13. 集成学习进阶二——lightGBM

lightGBM

lightGBM演进过程

在这里插入图片描述

AdaBoost算法

在这里插入图片描述

GBDT算法以及优缺点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

lightGBM入门

lightGBM是2017年1?,微软在GItHub上开源的?个新的梯度提升框架。
介绍链接
在这里插入图片描述
higgs数据集介绍:这是?个分类问题,?于区分产?希格斯玻??的信号过程和不产?希格斯玻??的信号过 程。
数据链接

lightGBM原理

在这里插入图片描述

基于Histogram(直?图)的决策树算法

在这里插入图片描述
在这里插入图片描述

Lightgbm 的Histogram(直?图)做差加速

在这里插入图片描述

带深度限制的Leaf-wise的叶???策略

在这里插入图片描述
在这里插入图片描述

直接?持类别特征

在这里插入图片描述
数据链接

直接?持?效并?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

lightGBM算法api

安装

pip3 install lightgbm

lightGBM参数—— Control Parameters

在这里插入图片描述

lightGBM参数—— Core Parameters

在这里插入图片描述
在这里插入图片描述

lightGBM参数—— IO parameter

在这里插入图片描述

调参建议

在这里插入图片描述
在这里插入图片描述

lightGBM案例一:鸢尾花

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_squared_error
import lightgbm as lgb

读取数据

iris = load_iris()
data = iris.data
target= iris.target
data

在这里插入图片描述

target

在这里插入图片描述

数据基本处理

x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.2)

模型训练

模型基本训练

# 模型基本训练
gbm = lgb.LGBMRegressor(objective="regression",learning_rate=0.05,n_estimators=20)
gbm.fit(x_train,y_train,eval_set=[(x_test,y_test)],eval_metric="l1",early_stopping_rounds=3)
gbm.score(x_test,y_test)

在这里插入图片描述

网格搜索进行训练

estimators = lgb.LGBMRegressor(num_leaves=31)
param_grid = {
    "learning_rate":[0.01,0.1,1],
    "n_estmators":[20,40,60,80]
}
gbm = GridSearchCV(estimator=estimators,param_grid=param_grid,cv=5)
gbm.fit(x_train,y_train)

在这里插入图片描述

gbm.best_params_

在这里插入图片描述

gbm = lgb.LGBMRegressor(objective="regression",learning_rate=0.1,n_estimators=20)
gbm.fit(x_train,y_train,eval_set=[(x_test,y_test)],eval_metric="l1",early_stopping_rounds=3)
gbm.score(x_test,y_test)

在这里插入图片描述

lightGBM案例二:绝地求生玩家排名预测

数据集字段

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
创建?个模型,根据他们的最终统计数据预测玩家的排名,从1(第?名)到0(最后?名)。 最后结果通过平均绝对误差(MAE)进?评估,即通过预测的winPlacePerc和真实的winPlacePerc之间的平均绝对误差

MAE

sklearn.metrics.mean_absolute_error

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

获取数据、基本数据信息查看

train = pd.read_csv("./data/train_V2.csv")
train.head()

在这里插入图片描述

# 查看一共有多少数据
train.shape  #(4446966, 29)
# 有多少场比赛
np.unique(train["matchId"]).shape #(47965,)
# 有多少队伍
np.unique(train["groupId"]).shape #(2026745,)

数据基本处理

# 数据缺失值处理 winPlacePerc有缺失值
np.any(train.isnull(),axis=0)

在这里插入图片描述

# 查找缺失值
train[train["winPlacePerc"].isnull()]

在这里插入图片描述

# 只有一行,删除即可
train = train.drop(2744604,inplace=True)
train.shape #(4446965, 29)
# 特征数据规范化处理
# 查看每场比赛参加的人数
count = train.groupby("matchId")["matchId"].transform("count")
train["playersJoined"] = count
train.head()

在这里插入图片描述

train["playersJoined"].sort_values().head()

在这里插入图片描述

plt.figure(figsize=(20,8))
sns.countplot(train["playersJoined"])
plt.grid()
plt.show()

在这里插入图片描述

plt.figure(figsize=(20,8))
sns.countplot(train[train["playersJoined"]>=75]["playersJoined"])
plt.grid()
plt.show()

在这里插入图片描述

# 规范化输出部分数据
train["killsNorm"] = train["kills"] * ((100-train["playersJoined"])/100+1)
train["damageDealtNorm"] = train["damageDealt"] * ((100-train["playersJoined"])/100+1)
train["maxPlaceNorm"] = train["maxPlace"] * ((100-train["playersJoined"])/100+1)
train["matchDurationNorm"] = train["matchDuration"] * ((100-train["playersJoined"])/100+1)

train.head()

在这里插入图片描述

# 部分变量合成
train["healsandboosts"] = train["heals"] + train["boosts"]
train[["heals", "boosts", "healsandboosts"]].tail(10)

在这里插入图片描述

# 异常值处理 删除有击杀,但是完全没有移动的玩家
train["totalDistance"] = train["rideDistance"] + train["walkDistance"] + train["swimDistance"]
train.head()

在这里插入图片描述

train["killwithoutMoving"] = (train["kills"] > 0) & (train["totalDistance"] == 0)
train[train["killwithoutMoving"] == True].head()

在这里插入图片描述

train[train["killwithoutMoving"] == True].shape #(1535, 37)
train[train["killwithoutMoving"] == True].index 

在这里插入图片描述

train.drop(train[train["killwithoutMoving"] == True].index, inplace=True)
train.shape #(4445430, 37)
# 异常值处理:删除驾车杀敌数异常的数据
train.drop(train[train["roadKills"] > 10].index, inplace=True)
train.shape #(4445426, 37)
# 异常值处理:删除玩家在一局中杀敌数超过30人的数据
train.drop(train[train["kills"] > 30].index, inplace=True)
train.shape #(4445331, 37)
# 异常值处理:删除爆头率异常数据
train["headshot_rate"] = train["headshotKills"]/train["kills"]
train["headshot_rate"].head()

在这里插入图片描述

train["headshot_rate"] = train["headshot_rate"].fillna(0)
train.head()

在这里插入图片描述

train[(train["headshot_rate"] == 1) & (train["kills"] > 9)].head()

在这里插入图片描述

train.drop(train[(train["headshot_rate"] == 1) & (train["kills"] > 9)].index, inplace=True)
train.shape #(4445307, 38)
# 异常值处理:删除最远杀敌距离异常数据
train.drop(train[train["longestKill"] >=1000].index, inplace=True)
train.shape #(4445287, 38)
# 异常值处理:删除关于运动距离的异常值
# 行走
train.drop(train[train["walkDistance"] >=10000].index, inplace=True)
train.shape #(4445068, 38)

# 载具
train.drop(train[train["rideDistance"] >=20000].index, inplace=True)
train.shape #(4444918, 38)

# 游泳
train.drop(train[train["swimDistance"] >=20000].index, inplace=True)
train.shape #(4444918, 38)
# 异常值处理:武器收集异常值处理
train.drop(train[train["weaponsAcquired"] >=80].index, inplace=True)
train.shape #(4444899, 38)
# 异常值处理:删除使用治疗药品数量异常值
train.drop(train[train["heals"] >=80].index, inplace=True)
train.shape #(4444898, 38)
# 类别型数据处理
# 比赛类型one-hot处理
train["matchType"].unique()

在这里插入图片描述

train = pd.get_dummies(train, columns=["matchType"])
train.head()

在这里插入图片描述

train.shape #(4444898, 53)
# 对groupId,matchId等数据进行处理
train["groupId"].head()

在这里插入图片描述

train["groupId"] = train["groupId"].astype("category")
train["groupId_cat"] = train["groupId"].cat.codes
train["groupId_cat"].head()

在这里插入图片描述

train["matchId"] = train["matchId"].astype("category")
train["matchId_cat"] = train["matchId"].cat.codes
train["matchId_cat"].head()

在这里插入图片描述

train.head()

在这里插入图片描述

train.drop(["groupId", "matchId"], axis=1, inplace=True)

# 数据截取 取部分数据进行使用(100000)
df_sample = train.sample(100000)
df_sample.shape #(100000, 53)

# 确定特征值和目标值
df = df_sample.drop(["winPlacePerc", "Id"], axis=1)
y = df_sample["winPlacePerc"]   
df.shape #(100000, 51)
y.shape #(100000,)

# 分割训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_valid, y_train, y_valid = train_test_split(df, y, test_size=0.2)
X_train.shape #(80000, 51)
y_train.shape #(80000,)

模型训练/模型评估

初步使用随机森林

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error

m1 = RandomForestRegressor(n_estimators=40, 
                           min_samples_leaf=3, 
                           max_features='sqrt',
                           n_jobs=-1)

m1.fit(X_train, y_train)
y_pre = m1.predict(X_valid)
m1.score(X_valid, y_valid)
mean_absolute_error(y_valid, y_pre)

再次使用随机森林,去掉不重要字段

m1.feature_importances_

在这里插入图片描述

imp_df = pd.DataFrame({"cols":df.columns, "imp":m1.feature_importances_})
imp_df.head()

在这里插入图片描述

imp_df = imp_df.sort_values("imp", ascending=False)
imp_df.head()

在这里插入图片描述

imp_df[:20].plot("cols", "imp", figsize=(20, 8), kind="barh")

在这里插入图片描述

to_keep = imp_df[imp_df.imp > 0.005].cols
to_keep.shape #(20,)
df_keep = df[to_keep]
X_train, X_valid, y_train, y_valid = train_test_split(df_keep, y, test_size=0.2)
X_train.shape #(80000, 20)

m2 = RandomForestRegressor(n_estimators=40, 
                           min_samples_leaf=3, 
                           max_features='sqrt',
                           n_jobs=-1)

m2.fit(X_train, y_train)
y_pre = m2.predict(X_valid)
m2.score(X_valid, y_valid) #0.9125654968172906
mean_absolute_error(y_valid, y_pre) #0.06408683094647326

使用lightGBM对模型进行训练

X_train, X_valid, y_train, y_valid = train_test_split(df, y, test_size=0.2)
X_train.shape #(80000, 51)

import lightgbm as lgb

gbm = lgb.LGBMRegressor(objective="regression", num_leaves=31, learning_rate=0.05, n_estimators=20)

gbm.fit(X_train, y_train, eval_set=[(X_valid, y_valid)], eval_metric="l1", early_stopping_rounds=5)

y_pre = gbm.predict(X_valid, num_iteration=gbm.best_iteration_)
mean_absolute_error(y_valid, y_pre) #0.12331524150224461

使用GridSearchCV对lightGBM模型进行调优

from sklearn.model_selection import GridSearchCV

estimator = lgb.LGBMRegressor(num_leaves=31)
param_grid = {
    "learning_rate":[0.01, 0.1, 1],
    "n_estimators":[40, 60, 80, 100, 200, 300]
}

gbm = GridSearchCV(estimator, param_grid, cv=5, n_jobs=-1)

gbm.fit(X_train, y_train)

y_pre = gbm.predict(X_valid)
mean_absolute_error(y_valid, y_pre) #0.05685004010605751
gbm.best_params_ #{'learning_rate': 0.1, 'n_estimators': 300}

三次调优

# n_estimators

scores = []
n_estimators = [100, 300, 500, 800]

for nes in  n_estimators:
    lgbm = lgb.LGBMRegressor(boosting_type='gbdt', 
                      num_leaves=31,
                      max_depth=5,
                      learning_rate=0.1,
                      n_estimators=nes,
                      min_child_samples=20,
                      n_jobs=-1)
    
    lgbm.fit(X_train, y_train, eval_set=[(X_valid, y_valid)], eval_metric="l1", early_stopping_rounds=5)
    
    y_pre = lgbm.predict(X_valid)
    
    mae = mean_absolute_error(y_valid, y_pre)
    
    scores.append(mae)
    print("本次结果输出的mae值是:\n", mae)

在这里插入图片描述

plt.plot(n_estimators,scores,'o-')
plt.ylabel("mae")
plt.xlabel("n_estimator")
print("best n_estimator {}".format(n_estimators[np.argmin(scores)]))

在这里插入图片描述

# max_depth

scores = []
max_depth = [3, 5, 7, 9, 11]

for md in  max_depth:
    lgbm = lgb.LGBMRegressor(boosting_type='gbdt', 
                      num_leaves=31,
                      max_depth=md,
                      learning_rate=0.1,
                      n_estimators=500,
                      min_child_samples=20,
                      n_jobs=-1)
    
    lgbm.fit(X_train, y_train, eval_set=[(X_valid, y_valid)], eval_metric="l1", early_stopping_rounds=5)
    
    y_pre = lgbm.predict(X_valid)
    
    mae = mean_absolute_error(y_valid, y_pre)
    
    scores.append(mae)
    print("本次结果输出的mae值是:\n", mae)

在这里插入图片描述

plt.plot(max_depth,scores,'o-')
plt.ylabel("mae")
plt.xlabel("max_depths")
print("best max_depths {}".format(max_depth[np.argmin(scores)]))

在这里插入图片描述

scores1

在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:11:31  更:2022-03-11 22:14:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:21:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码