人工智能学习9(LightGBM)

编译工具:PyCharm

文章目录

      • 编译工具:PyCharm
  • lightGBM原理
  • lightGBM的基础使用
  • 案例1:鸢尾花
  • 案例2:绝对求生玩家排名预测
    • 一、数据处理部分
      • 1.数据获取及分析
      • 2.缺失数据处理
      • 3.数据规范化
      • 4.规范化输出部分数据
      • 5.异常数据处理
        • 5.1删除开挂数据没有移动却kill了的
        • 5.2删除驾车杀敌数异常的数据
        • 5.3 删除一局中杀敌数超过30的
        • 5.4删除爆头率异常数据:认为杀敌人数大于9且爆头率为100%为异常数据
        • 5.5 最大杀敌距离大于1km的玩家
        • 5.6运动距离异常
        • 5.7武器收集异常
        • 5.8使用治疗药品数量异常
      • 6.类别型数据处理one-hot处理
      • 7.数据截取
    • 二、模型训练部分
      • 1.使用随机森林进行模型训练
      • 2.使用lightgbm进行模型训练

lightGBM原理

lightGBM主要基于以下几个方面进行优化,提升整体特性
1.基于Histogram(直方图)的决策树算法
2.Lightgbm的Histogram(直方图)做差加速
3.带深度限制的Leaf-wise的叶子生长策略
4.直接支持类别特征
5.直接支持高效并行

直方图算法降低内存消耗,不仅不需要额外存储与排序的结果,而且可以只保存特征离散化后的值。

一个叶子的直方图可以由他的父亲节点的直方图与它兄弟节点的直方图做差得到,效率会高很多。
在这里插入图片描述

lightGBM的基础使用

先安装包,直接安装可能会出现问题,建议改成清华大学提供的网站进行安装,安装速度快不会出错,命令行模式安装的话:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名称
pycharm安装的话-i https://pypi.tuna.tsinghua.edu.cn/simple 包名称
在这里插入图片描述
在这里插入图片描述

参数
在这里插入图片描述

案例1:鸢尾花

# 使用lightgbm模型训练
import pandas as pd
# sklearn提供的数据集
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
# lightGBM
import lightgbm as lgb


# 获取数据
iris = load_iris()
data = iris.data
target = iris.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=200)
gbm.fit(x_train, y_train, eval_set=[(x_test,y_test)], eval_metric="l1",callbacks=[lgb.early_stopping(stopping_rounds=3)])     #看到训练过程
print("----------基础模型训练----------")
print(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(estimators,param_grid,cv=5)
gbm.fit(x_train,y_train,callbacks=[lgb.log_evaluation(show_stdv=False)])
print("----------最优参数----------")
print(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",callbacks=[lgb.early_stopping(stopping_rounds=3)])     #看到训练过程
print("----------带入最优参数后----------")
print(gbm.score(x_test, y_test))

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
这里看到基础模型训练的结果比带入最优参数后的结果更好,原因在于基础训练里面,我们设置了200步,而最优参数才只需要20步。

案例2:绝对求生玩家排名预测

数据集:https://download.csdn.net/download/m0_51607165/84819953

一、数据处理部分

1.数据获取及分析

# 绝对求生玩家排名预测
import numpy as np
import numpy as py
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns


# 获取数据以及数据查看分析
train = pd.read_csv("./data/train_V2.csv")
# print(train.head())
print("----------查看一共有多少数据----------")
print(train.shape)
print("----------数据的整体描述----------")
print(train.describe())     # 数据的整体描述
print("----------数据的字段基本描述----------")
print(train.info())         # 数据的字段基本描述
print("----------一共有多少场比赛----------")
# print(train["matchId"])
# 去重
print(np.unique(train["matchId"]).shape)
print("----------有多少队伍----------")
print(np.unique(train["groupId"]).shape)

# 数据处理
# 查看缺失值
# print(np.any(train.isnull()))

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

2.缺失数据处理

# 查看缺失值
print("----------查看哪里有缺失值----------")
# print(np.any(train.isnull()))     # 这个只能打印出True说明存在缺失值
print(train.isnull().any())         # 打印缺失值的情况
# 查看发现只有winPlacePerc有缺失值
# 寻找缺失值,打印出来即可获取行号为 2744604
print("----------缺失值位置----------")
print(train[train["winPlacePerc"].isnull()])
# 删除缺失值
train = train.drop(2744604)
print(train.shape)

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

3.数据规范化

我的pycharm跑不出来了。。。我用转用线上的 jupyter notebook来写剩下的部分。
感觉jupyter notebook比pycharm方便

# 数据规范化
# 对每场比赛参加的人数进行统计
count = train.groupby("matchId")["matchId"].transform("count")
# 在train数据中添加一列,为当前该场比赛总参加人数
train["playersJoined"]=count
# print(train.head())
# 参赛人数排序小到大并显示
# print(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()

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

4.规范化输出部分数据

每局玩家数不一样,不能仅靠杀敌数等来进行比较

# kills(杀敌数),damageDealt(总伤害数)、maxPlace(本局最差名次)、matchDuration(比赛时长)
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()


# 比较经过规范化的特征值和原始特征值的值
to_show = ['Id','kills','killsNorm','damageDealt','damageDealtNorm','maxPlace','maxPlaceNorm','matchDuration','matchDurationNorm']
train[to_show][0:11]


train['healsandboosts']=train['heals']+train['boosts']


train[["heals","boosts","healsandboosts"]].tail()

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

5.异常数据处理

jupyter
我们认为以下数据为异常数据:
5.1没有移动有杀敌数的
5.2驾车杀敌大于10的
5.3一局中杀敌超过30的
5.4爆头率异常的数据:认为杀敌人数大于9且爆头率为100%为异常数据
5.5最大杀敌距离大于1km的玩家
5.6运动距离异常
5.7武器收集异常
5.8shiyong治疗药品数量异常

5.1删除开挂数据没有移动却kill了的
# 删除有击杀但是完全没有移动的玩家(开挂)
train["totalDistance"]=train["rideDistance"]+train["walkDistance"]+train["swimDistance"]
train.head()

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

# 查看开挂的数据
train[train["killwithoutMoving"] == True]

# 统计以下开挂的数据
train[train["killwithoutMoving"] == True].shape
# 删除开挂数据
train.drop(train[train["killwithoutMoving"] == True].index,inplace=True)
# 删除后的整体train数据
train.shape

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

5.2删除驾车杀敌数异常的数据
# 删除驾车杀敌大于10数据
train.drop(train[train["roadKills"] >10].index,inplace=True)
# 删除后整体train数据情况
train.shape

在这里插入图片描述

5.3 删除一局中杀敌数超过30的
# 删除一局中杀敌数超过30的
# 先查看
train[train["kills"]>30].head()
train.drop(train[train["kills"]>30].index,inplace=True)
train.shape

在这里插入图片描述

5.4删除爆头率异常数据:认为杀敌人数大于9且爆头率为100%为异常数据
# 删除爆头率异常的数据
# 计算爆头率
train["headshot_rate"]=train["headshotKills"]/train["kills"]
train["headshot_rate"].head()

# 对NaN的数据进行替换为0
train["headshot_rate"]=train["headshot_rate"].fillna(0)
train.head()

# 先检索有没有爆头率有问题的数据:认为杀敌人数大于9且爆头率为100%为异常数据
train [(train["headshot_rate"]==1)&(train["kills"]>9)].head()


# 删除
train.drop(train[(train["headshot_rate"]==1)&(train["kills"]>9)].index,inplace=True)
train.shape

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

在这里插入图片描述

5.5 最大杀敌距离大于1km的玩家
# 最大杀敌距离大于1km的玩家
train[train["longestKill"]>=1000].shape

train[train["longestKill"]>=1000]["longestKill"].head()

train.drop(train[train["longestKill"]>=1000].index,inplace=True)

train.shape

在这里插入图片描述

5.6运动距离异常
train[train['walkDistance']>=10000].shape


train.drop(train[train['walkDistance']>=10000].index,inplace=True)
train.shape
# 载具
train[train['rideDistance']>=20000].shape

train.drop(train[train['rideDistance']>=20000].index,inplace=True)
train.shape

# 游泳距离
train[train['swimDistance']>=2000].shape
train.drop(train[train['swimDistance']>=2000].index,inplace=True)
train.shape

在这里插入图片描述

5.7武器收集异常

# 武器收集异常
train[train['weaponsAcquired']>=80].index
train.drop(train[train['weaponsAcquired']>=80].index,inplace=True)
train.shape

在这里插入图片描述

5.8使用治疗药品数量异常
# 使用治疗药品数量异常
train[train['heals']>=80].index
train.drop(train[train['heals']>=80].index,inplace=True)
train.shape

在这里插入图片描述

6.类别型数据处理one-hot处理

# 查看比赛类别
train["matchType"].unique()
# 将比赛数据转换
train = pd.get_dummies(train,columns=["matchType"])
train.head()
# 正则化
matchType_encoding = train.filter(regex="matchType")
matchType_encoding.head()
# 对groupId数据转换
train["groupId"].head()
# 将类型转为category
train["groupId"]=train["groupId"].astype("category")
train["groupId"].head()
train["groupId_cat"]=train["groupId"].cat.codes
train["groupId_cat"].head()


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

# 将原来的groupId和matchId删除,axis=1按照列删除
train.drop(["groupId","matchId"],axis=1,inplace=True)
train.head()


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

7.数据截取

df_sample = train.sample(100000)
df_sample.shape

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

# 分割测试集和测试集
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)

在这里插入图片描述

二、模型训练部分

两种模型训练结果进行对比:
1.使用随机森林进行模型训练
2.使用lightgbm进行模型训练

1.使用随机森林进行模型训练

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
# 初步训练
# n_jobs = -1表示训练的时候,并行数和cpu的核数一样,如果传入具体的值,表示用几个核去泡
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.plot("cols","imp",figsize=(20,8),kind="barh")


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


# 找到相对比较重要的特征,去除一些冗余特征
to_keep=imp_df[imp_df.imp>0.005].cols
to_keep


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
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)

mean_absolute_error(y_valid,y_pre)

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

在这里插入图片描述

2.使用lightgbm进行模型训练


import lightgbm as lgb

# 初步lightgbm训练
x_train,x_valid,y_train,y_valid = train_test_split(df,y,test_size=0.2)
x_train.shape

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)


# 第二次调优:网格搜索进行参数调优
from sklearn.model_selection import GridSearchCV

estimator = lgb.LGBMRegressor(num_leaves=31)
param_grid={"learning_rate":[0.01,0.1,1],00
            "n_estimators":[40,60,80,100,200,300]}
gbm = GridSearchCV(estimator,param_grid,cv=5,n_jobs=-1)
gbm.fit(x_train,y_train,eval_set=[(x_valid,y_valid)],eval_metric="l1",early_stopping_rounds=5)


y_pred = gbm.predict(x_valid)
mean_absolute_error(y_valid,y_pred)

gbm.best_params_


# 第三次调优
# n_estimators
scores = []
n_estimators = [100,500,1000]
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)
    mae
# 可视化
import numpy as np
plt.plot(n_estimators,scores,'o-')
plt.ylabel("mae")
plt.xlabel("n_estimator")
print("best n_estimator {}".format(n_estimators[np.argmin(scores)]))

# 通过这种方式,可以继续对其他的参数调优,找到最优的参数
# ......

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/230374.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

调用win32 api获取电脑名字和系统目录

学习一下几个函数的功能,和调用方式; void CBasenameView::OnDraw(CDC* pDC) {CBasenameDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;TCHAR myname1[50], myname2[50], mydirname1[50], myd…

class061 最小生成树【算法】

class061 最小生成树【算法】 2023-12-8 11:48:12 算法讲解061【必备】最小生成树 code1 P3366 【模板】最小生成树 // Kruskal算法模版(洛谷) // 静态空间实现 // 测试链接 : https://www.luogu.com.cn/problem/P3366 // 请同学们务必参考如下代码中…

实战:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服务协同部署(包含解决浏览器访问Linux部署服务器本地资源问题)

1. 背景 在该实战中,我们将探讨如何使用Docker Compose协同部署Nginx、Java、Mysql和Redis服务,实现一个视频上传与展示的应用。具体需求如下: Java应用负责上传视频和图片资源到Nginx目录下,作为资源服务器。Nginx服务作为静态…

Redis数据已经删除了,为什么内存占用还是很高?

Redis数据已经删除了,为什么内存占用还是很高? Redis做了数据删除操作,为什么使用top命令时,还是显示Redis占了很多内存? 没做相关功课的人觉得这个问题有问题,删了数据还说占着内存,面试官不…

ubuntu22.04 安装cuda

CUDA(Compute Unified Device Architecture)是由 NVIDIA 开发的一种并行计算平台和编程模型。它允许开发者利用 NVIDIA 的 GPU(图形处理单元)进行高效的计算处理。CUDA 通过提供一系列的 C、C 和 Fortran 扩展,使得开发…

Navicat 技术指引 | 连接 GaussDB 分布式

Navicat Premium(16.3.3 Windows 版或以上)正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结…

小程序开发要多少钱

随着智能手机的普及和人们对移动应用的需求不断增长,小程序作为一种轻量级应用形式,在商业领域中备受关注。众多企业都渴望抓住这一机遇,但他们最关心的问题之一是:小程序开发需要多少钱? 一、开发方式选择 在开始小…

【LuatOS】笔记(二)基础框架

开发环境搭建 合宙官方搭建的是:vscodeLuatOS-SOC推荐拓展包(vscode插件),原文链接:LuatOS开发环境搭建。安装完创建项目文件,创建main.lua文件,就可以开始编写了。 函数与使用 LuatOS-SOC接口文档1,该文档…

MongoDB的插入文档、更新文档语句

本文主要介绍MongoDB的插入文档、更新文档语句。 目录 MongoDB插入文档MongoDB更新文档 MongoDB插入文档 在MongoDB中,可以通过使用insertOne或insertMany方法向集合中插入文档。 insertOne方法可以插入一个文档,例如: db.collection.inse…

【深度学习】一维数组的聚类

在学习聚类算法的过程中,学习到的聚类算法大部分都是针对n维的,针对一维数据的聚类方式较少,今天就来学习下如何给一维的数据进行聚类。 方案一:采用K-Means对一维数据聚类 Python代码如下: from sklearn.cluster im…

【Cisco Packet Tracer】路由器实验 静态路由/RIP/OSPF/BGP

本教程讲解路由器的静态IP配置、RIP、OSPF、BGP等实验内容。 一、基本设置 绘制以下拓扑结构: PC0设置: PC1设置: Router0端口0设置: Router0端口1设置: Router1端口0设置: Router1端口1设置&#xff1a…

Elasticsearch:使用 Elasticsearch 向量搜索及 RAG 来实现 Chatbot

Elasticsearch 的向量搜索为我们的语义搜索提供了可能。而在人工智能的动态格局中,检索增强生成(Retrieval Augmented Generation - RAG)已经成为游戏规则的改变者,彻底改变了我们生成文本和与文本交互的方式。 RAG 使用大型语言模…

PR剪辑视频做自媒体添加字幕快速方式(简单好用的pr视频字幕模板)

如何选择合适的字幕添加进短视频呢?首先要先确定增加的视频风格,简约、商务、科技感、炫酷;再确定用途,注释、标记、语音翻译、引用、介绍;最后在相应的模板中挑选几个尝试,悬着一个最切合主题的使用&#…

数据结构——队列

目录 一、队列的定义 二、队列的实现 1. 队列的顺序存储结构 1.1. 顺序队 1. 创建顺序队 2. 删除顺序队 3. 判断队列是否为空 4. 判断队列是否已满 5. 入队 6. 出队 7. 获取队列长度 8. 获取队首元素 1.2. 环形队 1. 创建环形队 2. 删除环形队 3. 判断环形队列…

QMenu风格设计qss+阴影

Qt的菜单经常在软件开发中用到&#xff0c;默认的菜单效果都不符合设计师的要求&#xff0c;本篇介绍QMenu菜单的风格设计&#xff0c;包括样式表和阴影。 1.QMenu样式表的设计 首先看一个默认的菜单 void QGraphicsDropShadowEffectDemo::slotShowDialog() {qDebug() <&l…

Navicat 技术指引 | 适用于 GaussDB 分布式的查询功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

关于前端原生技术-Jsonp的理解与简述

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/134777717 出自【进步*于辰的博客】 在学习了Jsoup这个知识点之后&#xff0c;发觉js的这一特点…

智慧社区前景无限,科技引领未来发展

社区是城镇化发展的标志&#xff0c;作为人类现代社会的生活的基本圈子&#xff0c;是人类生活离不开的地方&#xff0c;社区人口密度大、车辆多&#xff0c;管理无序&#xff0c;社区的膨胀式发展多多少少带来一定的管理上的缺失。社区作为智慧城市建设的重要一环&#xff0c;…

idea__SpringBoot微服务05——JSR303校验(新注解)(新的依赖),配置文件优先级,多环境切换

JSR303校验&#xff0c;配置文件优先级&#xff0c;多环境切换 一、JSR303数据校验二、配置文件优先级三、多环境切换一、properties多环境切换二、yaml多环境切换————————创作不易&#xff0c;如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏(*&#x…

【Linux】无法使用 ifconfig 查看系统网络接口信息,报错 command not found: ifconfig

问题描述 ifconfig是一个用于配置和显示系统网络接口信息的命令行工具。它通常用于Unix、Linux和其他类Unix系统中。 通过ifconfig命令&#xff0c;你可以查看和修改系统中网络接口的配置信息&#xff0c;包括IP地址、子网掩码、MAC地址、MTU&#xff08;最大传输单元&#x…