游戏最终排名预测--kaggle项目笔记
原项目链接
导入数据
#安装需要的 statsmodels 包。
#!pip install statsmodels==0.9.0
import pandas as pddf = pd.read_csv('https://labfile.oss.aliyuncs.com/courses/1363/PUBG.csv')
df.head()df.info()
df.describe()
各列含义如下,要预测的列为 winPlacePerc
数据可视化
对目标列winPlacePerc作图
import seaborn as sns
from matplotlib import pyplot as plt
%matplotlib inline
plt.style.use('fivethirtyeight')#做出列winPlacePerc与列winPoints 的图。
#winPlacePerc 列是系统给出的游戏排名,而 winPoints 是外部给出的游戏排名
fig, (ax1, ax2) = plt.subplots(1, 2)
fig.set_figwidth(15)
sns.distplot(df['winPlacePerc'], ax=ax1)
sns.distplot(df['winPoints'], ax=ax2)
plt.show()
#结论:有些两极分化,0 和 1 两头的人数都相对多一点
分析一下玩家击倒敌人的人数的情况:
train_dbno = pd.DataFrame(df['DBNOs'].value_counts(), columns=['DBNOs'])
dbno = train_dbno.iloc[:9, :]
dbno.iloc[8]['DBNOs'] = train_dbno.iloc[8:, :].sum()['DBNOs']
plt.figure(figsize=(14, 5))
sns.barplot(dbno.index, dbno.DBNOs)
plt.gca().set_xticklabels([0, 1, 2, 3, 4, 5, 6, 7, '8+'])
plt.gca().set_xlabel('No of enemy players knocked')
plt.gca().set_ylabel("count")
plt.show()
plt.savefig("enemy_")
#结论:许多玩家都是 0 击倒,说明大多数玩家水平可能还是处于初级阶段
再看击倒敌人的数量是否与最后的排名有关:
f, ax1 = plt.subplots(figsize=(15, 5))
sns.pointplot(x='DBNOs', y='winPlacePerc', data=df, alpha=0.8)
plt.xlabel('Number of DBNOs', fontsize=15, color='blue')
plt.ylabel('Win Percentage', fontsize=15, color='blue')
plt.title('DBNOs / Win Ratio', fontsize=20, color='blue')
plt.grid()
plt.show()
#结论:击倒敌人的数量越多,排名也就越高。这说明,击倒敌人与排名有很大的关系。
再看玩家自己所受到的伤害,条形图与箱线图
fig, (ax1, ax2) = plt.subplots(1, 2)
fig.set_figwidth(15)sns.distplot(df['damageDealt'], ax=ax1)
sns.boxplot(df['damageDealt'], ax=ax2)
plt.show()
#结论:大多数人的受到的伤害在 0 到 500 之间
分析玩家受伤害值是否与排名有关系
data = df.copy()
# 将伤害值分为 6 个部分。
data['damageDealt_rank'] = pd.cut(data['damageDealt'],[-1, 500, 1000, 1500, 2000, 2500, 60000],labels=['0_500', '500-1000', '1000-1500','1500-2000', '2000-2500', '2500+'])f, ax1 = plt.subplots(figsize=(14, 4))
sns.pointplot(x='damageDealt_rank', y='winPlacePerc', data=data, alpha=0.8)
plt.xlabel('damageDealtk', fontsize=15, color='blue')
plt.xticks(rotation=45)
plt.ylabel('Win Percentage', fontsize=15, color='blue')
plt.title('damageDealt / Win Ratio', fontsize=20, color='blue')
plt.grid()
plt.show()
#结论:由图知,玩家排名越靠前,所受到的伤害就越大
现在来看杀死敌人的排名情况
plt.figure()
sns.distplot(df['killPlace'], bins=50)
plt.show()
#结论:从上图可以看出,在杀死敌人排名中呈现均匀分布的现象。
再分析一下杀死敌人的数量
fig, (ax1, ax2) = plt.subplots(1, 2)
fig.set_figwidth(15)
sns.distplot(df['kills'], kde=False, ax=ax1)
sns.boxplot(df['kills'], ax=ax2)
plt.show()
#结论:大多数玩家杀死敌人的数量都不超过 5 个人。从右图看到有个别玩家在游戏中杀死敌人的数量超多了 20 人。
游戏玩家杀死敌人的数量与自己所受到的伤害的关系
plt.figure()
sns.regplot(df['kills'].values, df['damageDealt'].values)
plt.gca().set_ylabel('Damage dealt')
plt.gca().set_xlabel('Total kills')
plt.show()
#结论:一个玩家杀死敌人的数量越多,自己所受到的伤害就越大,基本呈线性关系
分析一下玩家杀死敌人的数量与排名的关系
data = df.copy()
# 将杀死敌人的数量分为 6 个部分。
data['kills_rank'] = pd.cut(data['kills'], [-1, 0, 2, 5, 10, 20, 60],labels=['0_kills', '1-2_kills', '3-5_kills','6-10_kills', '11-20_kills', '20+kills'])
plt.figure(figsize=(10, 4))
sns.boxplot(x='kills_rank', y='winPlacePerc', data=data)
plt.show()
#玩家杀死敌人的数量越多,其最后的排名也就越高
再来看一下玩家在游戏中,一枪爆头的个数
fig, (ax1, ax2) = plt.subplots(1, 2)
fig.set_figwidth(15)
sns.distplot(df['headshotKills'], ax=ax1)
sns.boxplot(df['headshotKills'], ax=ax2)
plt.show()
#结论:大多数玩家都没有一枪爆头。但在右图中,有个别玩家一枪爆头的数量到达了 8 人
爆头人数与排名之间的关系
f, ax1 = plt.subplots(figsize=(14, 4))
sns.pointplot(x='headshotKills', y='winPlacePerc', data=df, alpha=0.8)
plt.xlabel('Number of headshotKills', fontsize=15, color='blue')
plt.ylabel('Win Percentage', fontsize=15, color='blue')
plt.title('headshotKills/ Win Ratio', fontsize=20, color='blue')
plt.grid()
plt.show()
再看短时间内杀死敌人的数量
killstreak = pd.DataFrame(df['killStreaks'].value_counts())
killstreak.iloc[4] = killstreak.iloc[4:].sum()
killstreak = killstreak[:5]
sns.barplot(killstreak.index, killstreak['killStreaks'])
再看一下玩家在一局游戏中行走的距离
#在游戏中,角色的移动主要通过步行、游泳、和使用交通工具。现在可以通过对三者相加来求出玩家行走的距离。
data = df.copy()
data['move'] = data['rideDistance']+data['swimDistance']+data['walkDistance']
sns.distplot(data['move'])
#结论:大多数玩家行走的距离都在 0 到 5000 区间。只有及其少部分玩家超过了 5000
查看一下行走距离与排名之间的关系
data = df.copy()
# 将距离划分为 6 个部分。
data['move'] = data['rideDistance']+data['swimDistance']+data['walkDistance']
data['move_rank'] = pd.cut(data['move'], [-1, 2000, 4000, 6000, 8000, 10000, 60000],labels=['0_2000', '2000-4000', '4000-6000','6000-8000', '8000-10000', '10000+'])
plt.figure(figsize=(10, 4))
sns.boxplot(x='move_rank', y='winPlacePerc', data=data)
plt.show()
#从上图可以看出,玩家行走的距离越远,排名也就越高
再看捡枪的数量
fig, (ax1, ax2) = plt.subplots(1, 2)
fig.set_figwidth(15)
sns.distplot(df['weaponsAcquired'], ax=ax1)
sns.boxplot(df['weaponsAcquired'], ax=ax2)
#结论:大多数玩家在游戏中捡枪的数量都没有超过 10 。但在右图中,有个别玩家捡枪的数量超过了 40。
查看捡枪数量与排名的关系
f, ax1 = plt.subplots(figsize=(15, 5))
sns.pointplot(x='weaponsAcquired', y='winPlacePerc', data=df, alpha=0.8)
plt.xlabel('Number of weaponsAcquired', fontsize=15, color='blue')
plt.ylabel('Win Percentage', fontsize=15, color='blue')
plt.title('weaponsAcquired/ Win Ratio', fontsize=20, color='blue')
plt.grid()
plt.show()
#结论:捡枪的数量与排名大致呈正比关系
查看,使用救援类物质的数量与排名的关系,以及使用提升性物品的数量对排名的影响。
data = df.copy()
f, ax1 = plt.subplots(figsize=(14, 4))
sns.pointplot(x='heals', y='winPlacePerc', data=data, color='lime', alpha=0.8)
sns.pointplot(x='boosts', y='winPlacePerc', data=data, color='blue', alpha=0.8)
plt.text(0, 0.9, 'Heals', color='lime', fontsize=17, style='italic')
plt.text(0, 0.85, 'Boosts', color='blue', fontsize=17, style='italic')
plt.xlabel('Number of heal/boost items', fontsize=15, color='blue')
plt.ylabel('Win Percentage', fontsize=15, color='blue')
plt.title('Heals vs Boosts', fontsize=20, color='blue')
plt.grid()
#结论:救援类物质的数量和使用提升性物品的数量对排名均有一定的影响,但是提升性物品的影响要略大于救援类物质的影响。
特征工程
上面只是对数据集中的一些特征列进行了可视化,以便更好的理解数据。而我们的任务是根据这些特征来预测玩家的排名。现在我们对数据进行手工提取特征。
#救援类物品和提升性能类物品都可以算作是一类,因此将这两者加起来得到一个新的特征列。同样的方法对距离进行处理。
df['healsAndBoosts'] = df['heals']+df['boosts']
df['totalDistance'] = df['walkDistance']+df['rideDistance']+df['swimDistance']
#当使用提升类物品时,游戏玩家可以运行得更快。同时也帮助玩家保持在区外。因此,我们可以创建一个特征列,用来记录游戏玩家没走一步所消耗的提升性物品。救援类物品虽然不会使玩家跑得更快,但也有助于保持远离危险地带。所以让我们也为救援类物品创建相同的特征列。
df['boostsPerWalkDistance'] = df['boosts'] / \(df['walkDistance']+1) # 加 1 是为了防止分母为 0
df['boostsPerWalkDistance'].fillna(0, inplace=True)
df['healsPerWalkDistance'] = df['heals']/(df['walkDistance']+1)
df['healsPerWalkDistance'].fillna(0, inplace=True)
df['healsAndBoostsPerWalkDistance'] = df['healsAndBoosts'] / \(df['walkDistance']+1)
df['healsAndBoostsPerWalkDistance'].fillna(0, inplace=True)
df[['walkDistance', 'boosts', 'boostsPerWalkDistance', 'heals','healsPerWalkDistance', 'healsAndBoosts', 'healsAndBoostsPerWalkDistance']][40:45]
同样的方法,提取杀死敌人的数量与步行距离的关系
df['killsPerWalkDistance'] = df['kills'] / \(df['walkDistance']+1) # 加 1 是为了防止分母为 0
df['killsPerWalkDistance'].fillna(0, inplace=True)
df[['kills', 'walkDistance', 'rideDistance','killsPerWalkDistance', 'winPlacePerc']].tail(5)
构建模型
#再查看数据
df.head()
#从上图可以看到,此时的数据包含 36 列。但玩家编号(Id)、分组编号(groupId)、游戏局编号(matchId)、游戏的类型(matchType)对预测结果是没有帮助的。因此现在将这四列删除掉。
df_drop = df.drop(['Id', 'groupId', 'matchId', 'matchType'], axis=1)
划分训练集和测试集。
from sklearn.model_selection import train_test_splitdata_X = df_drop.drop(['winPlacePerc'], axis=1)
data_y = df_drop['winPlacePerc']
train_X, test_X, train_y, test_y = train_test_split(data_X, data_y.values, test_size=0.1)
使用随机森林回归
from sklearn.ensemble import RandomForestRegressormodel = RandomForestRegressor(n_estimators=40) # 构建模型
model.fit(train_X, train_y) # 训练模型
y_pred = model.predict(test_X) # 预测
y_pred[:10]
#上面我们完成了预测模型的构建预训练,并对测试集进行预测。为了直观的看出模型预测的好坏,现在通过画图的方法来对比。
f, ax1 = plt.subplots(figsize=(15, 5))plt.plot(test_y[:100])
plt.plot(y_pred[:100])
#在图中,蓝色线条表示测试数据的真实值,而红色线条表示预测的数据。从图中可以看出,我们所构建的模型基本能够预测正确。#现在查看一下均方误差。
from sklearn.metrics import mean_squared_errormean_squared_error(y_pred, test_y)
游戏最终排名预测--kaggle项目笔记相关推荐
- 波士顿房价预测学习项目笔记
机器学习入门项目 作为机器学习的入门项目,了解到这个一个监督学习类型的回归问题模型.项目中需要根据已有的数据,构建一个合理的模型对未来的房价可以做出预测. Udacity机器学习课程针对初学者做了精心 ...
- 电影票房预测-kaggle项目Python项目
研究问题:如何根据电影上映前的一些信息来预测出该电影的票房. 数据来源 数据主要是电影数据库中的 7000 多部过去电影的元数据.提供的数据信息包括演员,工作人员,情节关键词,预算,海报,发布日期,语 ...
- 信贷违约风险评估预测-kaggle项目
kaggle原案例 目标:为了确保贷款的安全性,需要对客户的信用或者还款能力进行评估 数据导入并预览 import pandas as pd df = pd.read_csv("https: ...
- 波士顿房价预测----Kaggle项目python项目
主要来源 Kaggle 上的一个入门挑战 房价预测 房价预测 https://www.kaggle.com/c/house-prices-advanced-regression-techniques ...
- 《绝地求生》玩家排名预测(2万5千字~大型综合实战)
<绝地求生>玩家排名预测 1. 项目背景 2. 数据集介绍 3. 项目评估方式 3.1 评估方式 3.2 MAE(Mean Absolute Error)介绍 4. 项目实现(数据分析+R ...
- Kaggle 自行车租赁预测比赛项目实现
作者:大树 更新时间:01.20 email:59888745@qq.com 数据处理,机器学习 回主目录:2017 年学习记录和总结 In [ ]: Kaggle上有很多有意思的项目,大家得空可以试 ...
- 【python】kaggle项目之纽约出租车行程时间预测
一.项目背景 (1)Kaggle项目,用于预测出租车出行的总时间. (2)根据已有数据,抽提出更多有用特征,提升预测的准确性. (3)依据探索出来的特征数据,探索性的发现纽约出租车的订单数量变化情况以 ...
- Titanic:Machine Learning from Disaster 人工智能,大数据分析常用入门kaggle项目
索引 0.了解Kaggle: 1.观察大局: 2.获得数据: 3.从数据探索和可视化中获得洞见: 4.机器学习算法的数据准备: 5.选择和训练模型: 6.微调模型: 0.了解Kaggle: Kaggl ...
- 《绝地求生》玩家排名预测-pubg(竞赛)参考型模
1 <绝地求生>玩家排名预测 ---- 你能预测<绝地求生>玩家战斗结束后的排名吗? 2 项目背景 2.1 项目简介 绝地求生(Player unknown's Battleg ...
最新文章
- Java 的 JSP 已经被淘汰了吗?
- 【专访】KDD2018主席熊辉教授:数据挖掘与深度学习结合新趋势
- python输入end退出循环_4.学习python获取用户输入和while循环及if判断语句
- camera---(3)双camera 生态链
- 如何使用apiPOST进行模拟发送get、post、delete、put请求(支持文件上传)
- vue中watch数组或者对象
- sql示例_SQL Server Lead功能概述和示例
- database design three form
- redis scan命令详解
- PAT 乙级1068 万绿丛中一点红(20 分)
- 【Unity3D Shader编程】之八 Unity5新版Shader模板源码解析径向模糊屏幕特效的实现
- 利用 nslookup 解析 DNS 记录
- win10下安装Debain Linux子系统
- python分析红楼梦中人物形象_《红楼梦》三大人物形象分析
- 如何发现Synaptics病毒
- Win10系统通用串行总线(USB驱动损坏)的一种解决方法
- Java语言查询附近店铺算法
- 常见的网络安全设备及功能汇总
- 计算机房考研英语考试时间按,考研各科目答题时间分配
- PrimeTime Labs学习笔记(二)
热门文章
- 如何使用股票行情软件看股票
- 不让「数据孤岛」成为 AI 发展的绊脚石,「联邦学习」将成突破口?...
- er到底是不是复韵母
- PowerShell 运行ps1文件
- 【弹性布局】【设置主轴,交叉轴对齐方式】
- 跟着瑜伽老师一节课程序员锻炼身体
- 测试ResNet在ImageNet验证集上的准确率
- taro Can‘t resolve ‘./style/index.scss‘ in ‘D:\projects\dev\self\myApp\node_modules\taro-ui\dist\wea
- stm32h743能跑linux吗,关于stm32H743 can配置
- 如何实现html5页面,自动提示添加到主屏幕