原项目链接

导入数据

#安装需要的 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项目笔记相关推荐

  1. 波士顿房价预测学习项目笔记

    机器学习入门项目 作为机器学习的入门项目,了解到这个一个监督学习类型的回归问题模型.项目中需要根据已有的数据,构建一个合理的模型对未来的房价可以做出预测. Udacity机器学习课程针对初学者做了精心 ...

  2. 电影票房预测-kaggle项目Python项目

    研究问题:如何根据电影上映前的一些信息来预测出该电影的票房. 数据来源 数据主要是电影数据库中的 7000 多部过去电影的元数据.提供的数据信息包括演员,工作人员,情节关键词,预算,海报,发布日期,语 ...

  3. 信贷违约风险评估预测-kaggle项目

    kaggle原案例 目标:为了确保贷款的安全性,需要对客户的信用或者还款能力进行评估 数据导入并预览 import pandas as pd df = pd.read_csv("https: ...

  4. 波士顿房价预测----Kaggle项目python项目

    主要来源 Kaggle 上的一个入门挑战 房价预测 房价预测 https://www.kaggle.com/c/house-prices-advanced-regression-techniques ...

  5. 《绝地求生》玩家排名预测(2万5千字~大型综合实战)

    <绝地求生>玩家排名预测 1. 项目背景 2. 数据集介绍 3. 项目评估方式 3.1 评估方式 3.2 MAE(Mean Absolute Error)介绍 4. 项目实现(数据分析+R ...

  6. Kaggle 自行车租赁预测比赛项目实现

    作者:大树 更新时间:01.20 email:59888745@qq.com 数据处理,机器学习 回主目录:2017 年学习记录和总结 In [ ]: Kaggle上有很多有意思的项目,大家得空可以试 ...

  7. 【python】kaggle项目之纽约出租车行程时间预测

    一.项目背景 (1)Kaggle项目,用于预测出租车出行的总时间. (2)根据已有数据,抽提出更多有用特征,提升预测的准确性. (3)依据探索出来的特征数据,探索性的发现纽约出租车的订单数量变化情况以 ...

  8. Titanic:Machine Learning from Disaster 人工智能,大数据分析常用入门kaggle项目

    索引 0.了解Kaggle: 1.观察大局: 2.获得数据: 3.从数据探索和可视化中获得洞见: 4.机器学习算法的数据准备: 5.选择和训练模型: 6.微调模型: 0.了解Kaggle: Kaggl ...

  9. 《绝地求生》玩家排名预测-pubg(竞赛)参考型模

    1 <绝地求生>玩家排名预测 ---- 你能预测<绝地求生>玩家战斗结束后的排名吗? 2 项目背景 2.1 项目简介 绝地求生(Player unknown's Battleg ...

最新文章

  1. Java 的 JSP 已经被淘汰了吗?
  2. 【专访】KDD2018主席熊辉教授:数据挖掘与深度学习结合新趋势
  3. python输入end退出循环_4.学习python获取用户输入和while循环及if判断语句
  4. camera---(3)双camera 生态链
  5. 如何使用apiPOST进行模拟发送get、post、delete、put请求(支持文件上传)
  6. vue中watch数组或者对象
  7. sql示例_SQL Server Lead功能概述和示例
  8. database design three form
  9. redis scan命令详解
  10. PAT 乙级1068 万绿丛中一点红(20 分)
  11. 【Unity3D Shader编程】之八 Unity5新版Shader模板源码解析径向模糊屏幕特效的实现
  12. 利用 nslookup 解析 DNS 记录
  13. win10下安装Debain Linux子系统
  14. python分析红楼梦中人物形象_《红楼梦》三大人物形象分析
  15. 如何发现Synaptics病毒
  16. Win10系统通用串行总线(USB驱动损坏)的一种解决方法
  17. Java语言查询附近店铺算法
  18. 常见的网络安全设备及功能汇总
  19. 计算机房考研英语考试时间按,考研各科目答题时间分配
  20. PrimeTime Labs学习笔记(二)

热门文章

  1. 如何使用股票行情软件看股票
  2. 不让「数据孤岛」成为 AI 发展的绊脚石,「联邦学习」将成突破口?...
  3. er到底是不是复韵母
  4. PowerShell 运行ps1文件
  5. 【弹性布局】【设置主轴,交叉轴对齐方式】
  6. 跟着瑜伽老师一节课程序员锻炼身体
  7. 测试ResNet在ImageNet验证集上的准确率
  8. taro Can‘t resolve ‘./style/index.scss‘ in ‘D:\projects\dev\self\myApp\node_modules\taro-ui\dist\wea
  9. stm32h743能跑linux吗,关于stm32H743 can配置
  10. 如何实现html5页面,自动提示添加到主屏幕