本学习笔记为阿里云天池龙珠计划机器学习训练营的学习内容,学习链接为:点我跳转
感谢各位的阅读
学习知识点概要
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)