本文主要是王者荣耀的英雄数据进行分类,数据源来源 https://github.com/cystanford/EM_data
1、数据加载
import pandas as pd
data = pd.read_csv(r'C:\Users\hzjy\Desktop\heros.csv',encoding='gb18030') #设置参数encoding,是为了防止中文乱码问题
数据比较完整,虽“次要定位”有缺失值,但不是关键属性,可以不做处理。
2、特征选择,对于相关性大的属性,进行降维
features = [u'最大生命',u'生命成长',u'初始生命',u'最大法力',u'法力成长',u'初始法力',u'最高物攻',u'物攻成长',u'初始物攻',u'最大物防',u'物防成长',u'初始物防',u'最大每5秒回血',u'每5秒回血成长',u'初始每5秒回血',u'最大每5秒回蓝',u'每5秒回蓝成长',u'初始每5秒回蓝',u'最大攻速',u'攻击范围']
data1 = data[features]
1)对英雄属性的相关性用热力图进行可视化分析
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
import seaborn as sns
corr = data1[features].corr() #各个特征属性的相关性
plt.figure(figsize=(14,14))
sns.heatmap(corr,annot =True) #annot =True 显示每个方格的数据
中间的数据代表两个属性之间的关系系数,最大值为1,代表完全正相关。可以看到,“最大生命”,“生命成长”这两个属性的相关性大,相关性大的属性只需保留其中一个属性即可。同理,可以对其他相关性大的属性进行筛选,保留一个。
features_remain = [u'生命成长',u'初始生命',u'法力成长',u'物攻成长',u'初始物攻',u'物防成长',u'初始物防',u'每5秒回血成长',u'每5秒回蓝成长',u'初始每5秒回蓝',u'最大攻速',u'攻击范围']
data2 = data[features_remain]
2)数据规范化
data2[u'最大攻速'] = data2[u'最大攻速'].apply(lambda x:float(x.strip('%'))/100)
data2[u'攻击范围'] = data2[u'攻击范围'].map({'远程':1,'近战':0})
from sklearn.preprocessing import StandardScaler
ss = StandardScaler() #Z-Score规范化数据
data2 = ss.fit_transform(data2)
3、GMM聚类分析
from sklearn.mixture import GaussianMixture
gmm = GaussianMixture(n_components = 30,covariance_type = 'full') #构造GMM聚类
gmm.fit(data2) #训练数据
prediction = gmm.predict(data2)
prediction
将分组结果导出:
data.insert(0,'分组',prediction)
data.to_csv(r'C:\Users\hzjy\Desktop\heros1.csv',index = False,sep = ',',encoding='gb18030')
4、聚类结果的评估:
采用 Calinski-Harabaz 指标
指标分数越高,代表聚类效果越好,即相同类中的差异性越小,不同类之间的差异性越大。