龙珠训练营机器学习-LightGBM学习笔记

本学习笔记为阿里云天池龙珠计划机器学习训练营的学习内容,学习链接为:点我跳转

学习知识点概要

LightGBM的介绍与应用、代码流程、英雄联盟胜利预测代码

学习内容

1.LightGBM的介绍与应用

1.1 LightGBM的介绍

LightGBM是2017年由微软推出的可扩展机器学习系统,是微软旗下DMKT的一个开源项目

1.1.1 LightGBM的主要优点

1.简单易用。提供了主流的Python\C++\R语言接口,用户可以轻松使用LightGBM建模并获得相当不错的效果。
2.高效可扩展。在处理大规模数据集时高效迅速、高准确度,对内存等硬件资源要求不高。
3.鲁棒性强。相较于深度学习模型不需要精细调参便能取得近似的效果。
4.LightGBM直接支持缺失值与类别特征,无需对数据额外进行特殊处理

1.1.2 LightGBM的主要缺点

相对于深度学习模型无法对时空位置建模,不能很好地捕获图像、语音、文本等高维数据。
在拥有海量训练数据,并能找到合适的深度学习模型时,深度学习的精度可以遥遥领先LightGBM。

1.2 LightGBM的应用

ightGBM被成功应用在工业界与学术界的各种问题中。例如金融风控、购买行为识别、交通流量预测、环境声音分类、基因分类、生物成分分析等诸多领域。

2.代码流程

Step1: 库函数导入
Step2: 数据读取/载入
Step3: 数据信息简单查看
Step4: 可视化描述
Step5: 利用 LightGBM 进行训练与预测
Step6: 利用 LightGBM 进行特征选择
Step7: 通过调整参数获得更好的效果

3.英雄联盟蓝方是否获胜预测

3.1 下载并读取数据

声明:对原代码进行了很多更改,并且用了本人正在改进的techlearn库
下载地址:
点我下载
读取数据:

# 常用库
import numpy as np
import pandas as pd
import techlearn as tl

## 绘图函数库
import matplotlib.pyplot as plt
import seaborn as sns


df = pd.read_csv('../data/high_diamond_ranked_10min.csv')
y = df.blueWins
## 利用.info()查看数据的整体信息
df.info()

3.2 查看蓝方胜负数据

# df.value_counts(y)
# df.value_counts("blueWins")
y.value_counts("blueWins")

胜负基本一致,证明胜负与红蓝无关,同时可以删除

## 标注特征列
drop_cols = ['gameId','blueWins']
x = df.drop(drop_cols, axis=1)

解释:为什么要赋值,因为尽可能备份每一次的操作,因为随时都有可能出问题,如果改了原值,怎么回滚。

3.2 删除其他冗余数据

举一反三,删除其他数据相近的数据

drop_cols = ['redFirstBlood','redKills','redDeaths'
             ,'redGoldDiff','redExperienceDiff', 'blueCSPerMin',
            'blueGoldPerMin','redCSPerMin','redGoldPerMin']
x.drop(drop_cols, axis=1, inplace=True)

采用散点图分析插眼的影响

# 构造两个新特征
x['wardsPlacedDiff'] = x['blueWardsPlaced'] - x['redWardsPlaced']
x['wardsDestroyedDiff'] = x['blueWardsDestroyed'] - x['redWardsDestroyed']

data = x[['blueWardsPlaced','blueWardsDestroyed','wardsPlacedDiff','wardsDestroyedDiff']].sample(1000)
data_std = (data - data.mean()) / data.std()
data = pd.concat([y, data_std], axis=1)
data = pd.melt(data, id_vars='blueWins', var_name='Features', value_name='Values')

plt.figure(figsize=(10,6))
sns.swarmplot(x='Features', y='Values', hue='blueWins', data=data)
plt.xticks(rotation=45)
plt.show()

在这里插入图片描述
发现不存在插眼数量与游戏胜负间的显著规律。

## 去除和眼位相关的特征
drop_cols = ['blueWardsPlaced','blueWardsDestroyed','wardsPlacedDiff',
            'wardsDestroyedDiff','redWardsPlaced','redWardsDestroyed']
x.drop(drop_cols, axis=1, inplace=True)

玩MOBA游戏,都知道KDA这个东西,正好我们构造两个新特征玩玩

x['killsDiff'] = x['blueKills'] - x['blueDeaths']
x['assistsDiff'] = x['blueAssists'] - x['redAssists']
data = x[['blueKills','blueDeaths','blueAssists','killsDiff','assistsDiff','redAssists']].sample(1000)
data_std = (data - data.mean()) / data.std()
data = pd.concat([y, data_std], axis=1)
data = pd.melt(data, id_vars='blueWins', var_name='Features', value_name='Values')

plt.figure(figsize=(10,6))
sns.swarmplot(x='Features', y='Values', hue='blueWins', data=data)
plt.xticks(rotation=45)
plt.show()

在这里插入图片描述
的确KDA与游戏胜负成正相关
那么打野开龙对游戏有影响嘛?

x['dragonsDiff'] = x['blueDragons'] - x['redDragons']
x['heraldsDiff'] = x['blueHeralds'] - x['redHeralds']
x['eliteDiff'] = x['blueEliteMonsters'] - x['redEliteMonsters']

data = pd.concat([y, x], axis=1)

eliteGroup = data.groupby(['eliteDiff'])['blueWins'].mean()
dragonGroup = data.groupby(['dragonsDiff'])['blueWins'].mean()
heraldGroup = data.groupby(['heraldsDiff'])['blueWins'].mean()

fig, ax = plt.subplots(1,3, figsize=(15,4))

eliteGroup.plot(kind='bar', ax=ax[0])
dragonGroup.plot(kind='bar', ax=ax[1])
heraldGroup.plot(kind='bar', ax=ax[2])

plt.show()

我们构造了两队之间是否拿到龙、是否拿到峡谷先锋、击杀大型野怪的数量差值,发现在游戏的前期拿到龙比拿到峡谷先锋更容易获得胜利。拿到大型野怪的数量和胜率也存在着强相关。
推塔是英雄联盟这个游戏的核心,因此推塔数量可能与游戏的胜负有很大关系。
证实一下我们的猜想:

x['towerDiff'] = x['blueTowersDestroyed'] - x['redTowersDestroyed']
data = pd.concat([y, x], axis=1)
towerGroup = data.groupby(['towerDiff'])['blueWins']
fig, ax = plt.subplots(1,2,figsize=(15,5))
towerGroup.mean().plot(kind='line', ax=ax[0])
ax[0].set_title('Proportion of Blue Wins')
ax[0].set_ylabel('Proportion')
towerGroup.count().plot(kind='line', ax=ax[1])
ax[1].set_title('Count of Towers Destroyed')
ax[1].set_ylabel('Count')

在这里插入图片描述
猜想正确的

3.3 利用 LightGBM 进行训练与预测

## 为了正确评估模型性能,将数据划分为训练集和测试集,并在训练集上训练模型,在测试集上验证模型性能。
from sklearn.model_selection import train_test_split

## 选择其类别为0和1的样本 (不包括类别为2的样本)
data_target_part = y
data_features_part = x

## 测试集大小为20%, 80%/20%分
x_train, x_test, y_train, y_test = train_test_split(data_features_part, data_target_part, test_size = 0.2, random_state = 2020)

## 导入LightGBM模型
from lightgbm.sklearn import LGBMClassifier
## 定义 LightGBM 模型 
clf = LGBMClassifier()
# 在训练集上训练LightGBM模型
clf.fit(x_train, y_train)
# 预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值