Categories
程式開發

FIFA20 對技能相近的球員分組(3):DBSCAN


了解DBSCAN

  • 基於密度的噪聲應用空間聚類。
  • 基於密度的聚類定位高密度區域,這些高密度區域被低密度區域彼此分開。
  • 密度:指定半徑內的點數(又名Eps 或ε)。

得分

  • 核心點 :如果一個點在Eps 中有超過指定數量的點(MinPts)。 、
  • 邊界點 :它在EPS 中少於MinPts,但在核心點附近。
  • 噪音點(離群值) :不是核心點或邊界點的任何點。

FIFA20 對技能相近的球員分組(3):DBSCAN 1

核心點、邊界點、離群值示例。

集群如何形成?

  1. 選擇一個點P。
  2. 從pwt eps 和MinPts 中檢索密度可達的所有點。
  • 如果p 是核心點,則形成一個聚類。
  • 如果p 是邊界點,則從p 沒有密度可達的點,並且DBSCAN 將訪問數據庫的下一個點。
  1. 繼續執行該過程,直至所有點都已處理完畢。
  2. 結果與點的處理順序無關。

ε-鄰域概念

  • 從對像到ε 半徑內的對象。
  • 和新對象:一個對象的ε-鄰域 至少包含MinPts 個 對象。

FIFA20 對技能相近的球員分組(3):DBSCAN 2

p 為和新對象

可達性

  • 直接密度可達 :如果q 在p 的ε-鄰域內,且p 為核心點,則點q 是從p 直接密度可達的。

FIFA20 對技能相近的球員分組(3):DBSCAN 3

  • 密度可達 :如果點p 在點q 的ε 距離內,且點q 在其鄰近點的可達距離ε 內有足夠數量的點,則稱點p 是從點q 密度可達。

FIFA20 對技能相近的球員分組(3):DBSCAN 4

連接性

  • 密度連接性 :如果存在點r,使得點p 和點q 可以從r 的wrt ε 和MinPts 密度可達,則點p 密度連接到點q。

FIFA20 對技能相近的球員分組(3):DBSCAN 5

q 通過r 密度連接到 p

優缺點及應用

優點 缺點 應用
對離群值檢測的健壯性 對eps 和MinPts 敏感 衛星圖像
最適合分離高密度的聚類與低密度的聚類 若數據集過於稀疏,則不合適 異常檢測

使用DBSCAN 對FIFA 20 球員進行分組

數據清理/預處理(第一部分和第二部分的代碼)

import pandas as pd
import numpy as np
df = pd.read_csv("/content/players_20.csv")
df = df[['short_name','age', 'height_cm', 'weight_kg', 'overall', 'potential','value_eur', 'wage_eur', 'international_reputation', 'weak_foot','skill_moves', 'release_clause_eur', 'team_jersey_number','contract_valid_until', 'nation_jersey_number', 'pace', 'shooting','passing', 'dribbling', 'defending', 'physic', 'gk_diving','gk_handling', 'gk_kicking', 'gk_reflexes', 'gk_speed','gk_positioning', 'attacking_crossing','attacking_finishing','attacking_heading_accuracy', 'attacking_short_passing','attacking_volleys', 'skill_dribbling', 'skill_curve','skill_fk_accuracy', 'skill_long_passing','skill_ball_control','movement_acceleration', 'movement_sprint_speed', 'movement_agility','movement_reactions', 'movement_balance', 'power_shot_power','power_jumping', 'power_stamina', 'power_strength', 'power_long_shots','mentality_aggression', 'mentality_interceptions','mentality_positioning', 'mentality_vision', 'mentality_penalties','mentality_composure', 'defending_marking', 'defending_standing_tackle','defending_sliding_tackle', 'goalkeeping_diving','goalkeeping_handling', 'goalkeeping_kicking','goalkeeping_positioning', 'goalkeeping_reflexes']]
df = df[df.overall > 86] # extracting players with overall above 86
df = df.fillna(df.mean())
names = df.short_name.tolist() # saving names for later
df = df.drop(['short_name'], axis = 1) # drop the short_name column
df.head()

標準化數據

from sklearn import preprocessing
x = df.values # numpy array
scaler = preprocessing.MinMaxScaler()
x_scaled = scaler.fit_transform(x)
X_norm = pd.DataFrame(x_scaled)

使用PCA 將60 列減少到2 列

from sklearn.decomposition import PCA
pca = PCA(n_components = 2) # 2D PCA for the plot
reduced = pd.DataFrame(pca.fit_transform(X_norm))

應用DBSCAN

from sklearn.cluster import DBSCAN
# train the model using DBSCAN
db = DBSCAN(eps=1, min_samples=5)
# the prediction for dbscan clusters
db_clusters = db.fit_predict(reduced)

通過添加球員名字和他們的聚類來創建新的數據幀

reduced['cluster'] = db_clusters
reduced['name'] = names
reduced.columns = ['x', 'y', 'cluster', 'name']
reduced.head()

繪製DBSCAN

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set(style="white")
ax = sns.lmplot(x="x", y="y", hue="cluster", data = reduced, legend=False,fit_reg=False, size = 10, scatter_kws={"s": 250})
texts = []
for x, y, s in zip(reduced.x, reduced.y, reduced.name):
    texts.append(plt.text(x, y, s))

ax.set(ylim=(-2, 2))
plt.tick_params(labelsize=15)
plt.xlabel("PC 1", fontsize = 20)
plt.ylabel("PC 2", fontsize = 20)
plt.show()

FIFA20 對技能相近的球員分組(3):DBSCAN 6

DBSCAN,Eps = 1,MinPts = 5

  • 聚類形成為守門員和其他球員
  • 不是很準確

尋找最佳ε

  • 通過計算每個點到最近的n 個點的距離,對結果進行排序和繪製,找出最佳ε。
from sklearn.neighbors import NearestNeighbors
# calculate the distance from each point to its closest neighbor
nn = NearestNeighbors(n_neighbors = 2)
# fit the nearest neighbor
nbrs = nn.fit(reduced)
# returns two arrays - distance to the closest n_neighbors points and index for each point
distances, indices = nbrs.kneighbors(reduced)
# sort the distance and plot it
distances = np.sort(distances, axis=0)
distances = distances[:,1]
plt.plot(distances)

FIFA20 對技能相近的球員分組(3):DBSCAN 7

尋找最佳ε

使用新的Eps 再次應用DBSCAN

from sklearn.cluster import DBSCAN
# train the model using DBSCAN
db= DBSCAN(eps=0.3, min_samples=4)
# prediction for dbscan clusters
db_clusters = db.fit_predict(reduced)
reduced['cluster'] = db_clusters
reduced['name'] = names
reduced.columns = ['x', 'y', 'cluster', 'name']
reduced.head()

以新的Eps=0.3 和MinPts=4 再次繪製

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set(style="white")
ax = sns.lmplot(x="x", y="y", hue="cluster", data = reduced, legend=False,fit_reg=False, size = 9, scatter_kws={"s": 250})
texts = []
for x, y, s in zip(reduced.x, reduced.y, reduced.name):
    texts.append(plt.text(x, y, s))

ax.set(ylim=(-2, 2))
plt.tick_params(labelsize=10)
plt.xlabel("PC 1", fontsize = 20)
plt.ylabel("PC 2", fontsize = 20)
plt.show()

FIFA20 對技能相近的球員分組(3):DBSCAN 8

Eps=0.3,MinPts=4 的DBSCAN 圖

結論

使用Eps=0.3 和MinPts=4 的DBSCAN 在分組和檢測離群值方面做得更好!

感謝閱讀本文,希望對您有所幫助!

GitHub存儲庫: https://github.com/importdata/Clustering-FIFA-20-Players

作者介紹

Jaemin Lee,專攻數據分析與數據科學,數據科學應屆畢業生。

原文鏈接

https://towardsdatascience.com/grouping-soccer-players-with-like-skillsets-in-fifa-20-part-3-dbscan-b23389a08cc7