对于一般机器学习来说,总体的流程其实分为三个大的步骤:
1. 数据清洗
2. 模型构建
3. 模型评估
其中,第二步和部分第三步都是靠套路进行解决的,所需要修改的部分只是一些调参,可以使用gridCV 的方法进行调参,很多情况下能得到不错的效果。
所以其实最难的部分主要其实还是数据清洗,相对于调用库来说,怎样把数据清洗成有用的、自己想要的格式,是一个最大的问题。
数据清洗难题的解决办法
个人认为机器学习相对于深度学习简单的一个原因,就是因为机器学习的可解释性很强,每一步都可以根据实际情况进行解释,所以带入实际问题去理解数据是个不错的选择,例如本例中,无武器杀人,或者单场杀人过多,行走距离过短,没有掉血行为的,都很有可能是外挂。在入门比赛泰坦尼克号的代码中,这个问题会更加明显。。
整个流程的套路:
流程分析:
-
获取数据
1.1 数据集说明
x, y 位置坐标
accuracy 位置的准确率
time 时间戳
placeid 位置点 -
基本数据处理
2.1 太大了,缩小数据范围
2.2 #- assists [助攻数]
#- boosts [使用能量,道具数量]#- damageDealt [总伤害]
#- DBNOs [击倒敌人数量]
#- heals [使用治疗药品数量]
#- killPlace [本场比赛杀敌排行]
- kills [杀敌数]
- killStreaks [连续杀敌数]
- matchDuration [比赛时长]
- rankPoints [Elo排名]
- revives [救活队员的次数]
- rideDistance [驾车距离]
- teamKills [杀死队友的次数]
- vehicleDestroys [毁坏机动车的数量]
- walkDistance [步行距离]
- winPoints [胜率Elo排名]
- winPlacePerc [百分比排名]
2.3 筛选出签到多的地方
2.4 确定特征值、目标值
2.5 分割数据集
-
特征工程
3.1 数据标准化 -
机器学习(knn + cv)
-
模型评估
数据在这儿:
https://pan.baidu.com/s/1TrcWYfTaJrHZGWXQ_R_l8Q 提取码acdf
代码如下:
# 1. 获取数据
file_path = "./pubg/PUBG_to_stu/data/train_V2.csv"
df = pd.read_csv(file_path)
print(df.head())
print(df.shape)
# 2. 基本数据处理
# 2.1 去掉na
df_0 = df.dropna(axis=0, how='any')
print(df_0.shape)
# 2.2 选取部分数据
df_part = df_0
print(df_part.shape)
# 收集武器数为0,有击杀数
df_part_distance["weapon"] = (df_part_distance["kills"] > 0) & (df_part_distance["weaponsAcquired"] == 0)
df_part_d_weapon = df_part_distance.drop(df_part_distance[df_part_distance["weapon"] == True].index)
print(df_part_d_weapon.shape)
# 击杀值过高
df_part_d_w_kills = df_part_d_weapon.drop(df_part_d_weapon[df_part_d_weapon["kills"]>30].index)
# 爆头率过高
df_part_d_w_kills['headshot_rate'] = df_part_d_w_kills['headshotKills'] / df_part_d_w_kills['kills']
df_part_d_w_kills['headshot_rate'] = df_part_d_w_kills['headshot_rate'].fillna(0)
df_part_d_w_k_heads = df_part_d_w_kills.drop(df_part_d_w_kills[(df_part_d_w_kills['headshot_rate'] == 1) & (df_part_d_w_kills['kills'] > 9)].index)
print(df_part_d_w_k_heads.shape)
# 2.3 筛选一些有用的列
df_select = df_part_d_w_k_heads[["assists","boosts","DBNOs","heals","kills","matchDuration","rankPoints","revives","rideDistance","teamKills",
"vehicleDestroys","walkDistance","winPoints"]]
print(df_select.shape)
# 2.4 确定特征值、目标值
x = df_select
y = df_part_d_w_k_heads[["winPlacePerc"]]
print(x.shape)
print(y.shape)
# 3. 特征工程
# 3.1 数据标准化
# 3.1.1 实例化标准化对象
transfer = StandardScaler()
# 3.1.2调用fit_trainsform 先计算均值,标准差,在进行标准化
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
print("完成标准化")
# 4. 机器学习(knn + cv)
# 4.1 实例化估计器
estimator =Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None,
normalize=False, random_state=None, solver='auto', tol=0.001)
# 4.2 训练
estimator.fit(x_train, y_train)
print("完成训练")
# 5. 模型评估
# 5.1 预测值输出
y_pre = estimator.predict(x_test)
print("预测值:", y_pre)
print("完成预测")
# 5.2 score
score = estimator.score(x_test, y_test)
print("准确率:", score)
mae = mean_absolute_error(y_test, y_pre)
print(mae)