在这篇文章中,将探讨如何根据特定的特征对流行的视频游戏进行分类。这个项目是在学习K-Means聚类算法的过程中完成的。阅读完这篇文章后,将能够掌握使用Pandas进行数据操作、使用KNN插补缺失值、降低数据维度以及应用K-Means聚类等技能。将以一种易于理解的方式撰写这篇文章,所以请拿一杯咖啡,慢慢阅读。
首先,需要导入一些必要的包。以下是需要的包列表。
# 导入包的代码
现在,将使用Pandas读取数据,并在将数据输入模型之前进行一些预处理步骤。数据以CSV格式存储。可以从GitHub仓库下载数据。
data = pd.read_csv("data/video_games.csv")
如果打印这个数据集的前五行,表格看起来会像这样。
现在,让检查数据集中是否有任何空值。为此,运行以下代码。
plt.figure(figsize=(10,8))
sns.heatmap(data.isnull(), cmap='magma', yticklabels=False)
如果运行这段代码,输出将如下所示。
让以数值形式查看空值的数量。
data.isnull().sum()
哇!数据集中存在如此多的空值。因此,为了更好的插补,将使用fancyimpute包中的KNearestNeighbors算法。但在那之前,想删除一些空值:
还想删除一些列。release_date和achievements对于搜索游戏或确定类型并不重要,现在将删除original_price列以简化问题。如果之前看过表格,original_price列包含混合值。以下是original_price列50个唯一值的图片。
只需查看图片。一些游戏是免费的,一些是付费的。但无法改变这个列的数据类型。因此,将删除这个列。
data.drop(['release_date', 'achievements', 'original_price'], axis=1, inplace=True)
现在,让删除空值。
删除所有不必要的行后,现在数据集的大小是(40748, 6)。由于这是一个庞大的数据集,需要取这个数据的一部分。从数据中取了两部分。一部分用于训练,一部分用于测试。之后,将对分类变量进行编码并插补它们。
如果一切顺利,训练和测试的前五行在编码后看起来会像这样。
现在到了插补的时间。但在那之前,必须安装fancyimpute。可以通过运行以下命令来安装它。
pip install fancyimpute
成功安装后,可以使用fancyimpute中的KNN算法。
现在,如果想验证数据集中没有空值,只需运行以下代码。
print(data1.isnull().sum())
print(data2.isnull().sum())
将为两者获得以下输出:
在插补所有值并验证它们之后,现在是建模的时候了。根据问题,需要使用聚类技术进行分类。在这里使用K-Means聚类。在将数据输入模型之前,必须再次对其进行编码。
应用主成分分析(PCA)
现在,将使用主成分分析(PCA)提取重要特征。没有这个,K-Means在聚类数据时表现非常糟糕。
在这里,将为PCA取两个组件。可以尝试不同的数量。
现在有一个问题是如何确定K-means中的聚类数量。有两种方法可以做到这一点——轮廓系数和肘部方法。在这里使用肘部方法。必须在这种方法中绘制一个基于不同聚类数量的不同惯性的图表。必须选择一个从那里开始值变化最小的聚类数量。因为这个图表看起来像人的肘部,所以这个方法的名字叫肘部方法。
如果运行上述代码,将获得以下输出。
从这个图表中,可以看到2是理想的聚类数量。
现在准备好聚类了。
如果代码运行成功,可以看到以下图表。
在2个聚类上训练模型并在训练集上进行预测后,这是机器将游戏聚类为两部分的结果。尽管这里没有包含价格列,机器仍然将它们聚类为两部分。让看看测试集的结果。
如果运行上述代码,可以看到以下图表:
游戏也被分为两个聚类,但聚类2的数据点缺失。测试集可能只包含与聚类1相关的数据点。
从上述两个图表中,可以清楚地说模型成功地区分了两个类别。
视频游戏聚类模型可以通过考虑original_price列来改进。
由于计算资源有限,不得不对数据进行抽样,并在它们上工作。如果可以对整个数据进行模型训练,这个模型在聚类数据时可以更准确。
还有特征工程的空间,比如使用positive_percent和num_reviews列创建一个新的列positive_review。