楼主: 时光永痕
385 0

[数据挖掘新闻] 面向数据科学初学者的Python集群介绍 [推广有奖]

  • 0关注
  • 14粉丝

svip3

学术权威

12%

(VIP/贵宾)三级

54%

威望
0
论坛币
26 个
通用积分
49.7576
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
34070 点
帖子
2731
精华
0
在线时间
316 小时
注册时间
2020-7-21
最后登录
2024-4-28

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
面向数据科学初学者的Python集群介绍
从数据中提取知识一直是一项重要任务,尤其是当我们要基于数据做出决策时。但是随着前进,数据变得越来越大,因此我们无法用肉眼对其进行分析。因此,我们需要能够有效处理此类任务的工具,其中一种称为机器学习。
机器学习是对执法机关的方法[R N种模式中的数据。通过使用它,我们可以使任务自动化或从中发现隐藏的知识。学习类型很多,但是我只想指定无监督学习。
无监督学习是针对未标记数据的学习方法。它的主要目的是提取数据内部的隐藏知识。聚类就是其中之一,它根据其特征对数据进行分组。
在本文中,我想向您展示如何在Python中进行聚类分析。为此,我们将使用亚洲开发银行(ADB)的数据。最后,我们将根据以下国家/地区的电力来源发现集群,如下所示:
聚类-电源
资料来源:作者
大纲
我将文章分为以下几节:
问题陈述和数据收集
预处理数据
数据建模
分析数据
流程
问题陈述和数据收集
我们要解决的问题是根据国家的电力来源和描述每个群体的特征将它们聚集起来。在这种情况下,我们将分析来自亚洲开发银行(ADB)的数据。
数据来自名为《 2020年亚洲及太平洋主要指标》的出版物。它包含的统计数据包括经济,社会,环境,政府等。此外,它根据可持续发展目标(SDG)的目标对数据进行划分。
在这种情况下,我们将仅在分析2017年亚行每个成员的能源部门统计数据时指定问题。要访问数据集,请访问此处的链接。
对于数据集,我们将仅使用四列。他们是-
国家的名字
基于水电的电比例
基于太阳能的电力比例
基于可燃燃料的电力比例
下载数据集后,我们可以像这样将其加载到我们的代码或笔记本中,
# Import libraries
import pandas as pd# Load the fuel-sourced energy dataset
data1 = pd.read_excel('data-1.xls')
data1 = data1.replace('...'
fuel = data1[['Country'
fuel.columns = ['country'
data2 = pd.read_excel('data-2.xls')
data2 = data2.replace('...'
solar = data2[['Country'
solar.columns = ['country'
data3 = pd.read_excel('data-3.xls')
data3 = data3.replace('...'
hydro = data3[['Country'
hydro.columns = ['country'
combine = pd.concat([fuel
combine = combine.iloc[:
combine.head()
运行代码后,数据集将如下所示,
聚类-数据集
现在,我们可以继续进行下一步。
预处理数据
下载并合并数据集后,有几个假设需要满足。他们是,
每列都有一个正态分布(无左偏或右偏)
每列应具有相同的值范围
我们必须检查这些假设的原因是为了确保我们可以对数据使用机器学习模型。要知道数据是否符合假设,我们必须在视觉上对其进行探索。我们可以使用直方图可视化每一列。代码看起来像这样,
# Import libraries
import matplotlib.pyplot as plt
import seaborn as sns# Visualize the plot
fig
sns.distplot(combine.fuel_energy
sns.distplot(combine.solar_energy
sns.distplot(combine.hydro_fuel
plt.tight_layout()
plt.show()
结果就是这样
聚类-分布
正如我们在上面看到的那样,这些变量具有偏斜的分布。fuel_energy列的分布稍微偏左,其余的分布则偏右。因此,我们必须改变它们的分布。
我们可以将许多变换类型应用于分布,例如,对数变换,立方根变换,幂变换等。在这种情况下,我们将对每个列使用Yeo-Johnson变换。代码看起来像这样,
# Import the library
from sklearn.preprocessing import power_transform# Extract the specific column and convert it as a numpy array
X = combine[['fuel_energy'
X_transformed = power_transform(X
应用该函数后,每列上的分布将如下所示,
聚类
正如我们在上面看到的,尽管有双峰分布,但每一列的分布都更接近于正态分布。但是没问题,我们可以使用此转换进行下一步。
转换数据后,下一步是归一化每一列的方差。此步骤使每一列都有值范围。这样做的原因是要避免每列的任何支配地位,以免对结果造成偏差。
在Python中,我们可以使用sklearn库中的MinMaxScaler对象为我们完成此操作。初始化该对象后,我们可以拟合数据并使用fit_transform方法对其进行转换。代码看起来像这样,
# Import the library
from sklearn.preprocessing import MinMaxScaler# Instantiate the object
scaler = MinMaxScaler()# Fit and transform the data
X_transformed = scaler.fit_transform(X_transformed)
如果我们看到统计摘要,则可以看到最小值为0,最大值为1。为了证明我们可以查看其统计摘要。结果是这样
聚类-转换
基于该摘要,我们可以继续进行下一步,即建模部分。
数据建模
在本节中,我们将转换后的数据应用到称为K-Means的算法中。让我向您介绍此算法。
首先,该算法将初始化几个质心。然后,每个观测值将选择最近的质心并加入该群集。质心会随着时间而变化,并且将迭代这些步骤,直到质心上没有明显变化为止。这是算法的说明,
图片发布
资料来源:Wikimedia
让我们开始应用此算法。我们要做的第一件事是选择适合数据的最佳簇数。为了确定这一点,我们必须执行一个称为超参数调整的步骤。
超参数调整是我们通过不同的参数(在本例中为簇数)运行模型以选择最佳模型的地方。
为了知道哪个模型是最好的模型,我们将基于它们的平方误差之和评估模型,并使用折线图将其可视化。根据该图表,我们将选择错误开始不明显减少的群集数目。我们称其为肘法的评估。
为此,我们运行如下代码:
# Import the library
from sklearn.cluster import KMeans# To make sure our work becomes reproducible
np.random.seed(42)inertia = []# Iterating the process
for i in range(2
  # Instantiate the model
    model = KMeans(n_clusters=i)
  # Fit The Model
    model.fit(X_transformed)
  # Extract the error of the model
    inertia.append(model.inertia_)# Visualize the model
sns.pointplot(x=list(range(2
plt.title('SSE on K-Means based on # of clusters')
plt.show()
这是代码的可视化效果,
集群-SSE
正如我们在上面看到的,数字5是模型的最佳参数。这样做的原因是因为错误开始逐渐减小。因此,我们将使用数字5作为集群的数字。现在,我们可以将模型应用于数据,并将聚类结果保存到数据框中。
代码看起来像这样,
# To make sure our work becomes reproducible
np.random.seed(42)# Instantiate the model
model = KMeans(n_clusters=5)# Fit the model
model.fit(X_transformed)# Predict the cluster from the data and save it
cluster = model.predict(X_transformed)# Add to the dataframe and show the result
combine['cluster'] = cluster
combine.head()
这是桌子的样子,
图片发布
有了这些数据,现在我们可以分析结果了!
分析数据
我们已经完成了建模部分。现在,我们可以分析结果了。通过这样做,我们将了解一些有趣的模式,特征以及每个集群的成员。所以,我们开始!
首先,我们可以总结一下谁是每个集群的成员。为此,我们可以运行如下代码:
for i in range(5):
    print("Cluster:"
    print("The Members:"
    print("Total Members:"
    print()
结果是这样
群组: 0
成员:库克群岛| 基里巴斯| 韩国| 马尔代夫| 马绍尔群岛| 密克罗尼西亚联邦储备银行。州| 瑙鲁| 纽埃| 所罗门群岛| 汤加| 图瓦卢
会员总数: 11名群集: 1
名成员:阿塞拜疆| 柬埔寨| 印尼| 哈萨克斯坦| 马来西亚| 巴基斯坦| 巴布亚新几内亚| 乌兹别克斯坦
成员总数: 8群集: 2
成员:孟加拉国| 文莱达鲁萨兰国| 中国香港| 蒙古| u琉 新加坡| 东帝汶| 土库曼斯坦
成员总数: 8群集: 3
成员:澳大利亚| 中国人民共和国| 印度| 日本| 菲律宾| 萨摩亚| 斯里兰卡| 泰国| 瓦努阿图
成员总数: 9群: 4
成员:阿富汗| 亚美尼亚| 不丹| 斐济| 佐治亚州| 吉尔吉斯共和国| 老挝人民民主共和国| 缅甸| 尼泊尔| 新西兰| 塔吉克斯坦| 越南
会员总数: 12
其次,我们可以解释每个集群的特征。为此,我们将分析它们中的每一个并创建一个条形图。执行此操作的代码如下所示,
# Importing libraries
import seaborn as sns
import matplotlib.pyplot as plt# Create the dataframe to ease our visualization process
visualize = pd.DataFrame(model.cluster_centers_) #.reset_index()
visualize = visualize.T
visualize['column'] = ['fuel'
visualize = visualize.melt(id_vars=['column']
visualize['cluster'] = visualize.cluster.astype('category')# Visualize the result
plt.figure(figsize=(12
sns.barplot(x='cluster'
plt.title('The cluster\'s characteristics')
plt.show()
这是它的结果,
集群特征
最后,我们可以使用Plotly创建地理空间可视化。使Plotly形象地显示出来的原因是,它增加了我们结果的交互性。因此,我们可以进一步分析它。为此,我们可以运行如下代码:
# Import the libraries
import plotly.express as px# Set the column as categorical value
combine['cluster'] = combine.cluster.astype('category')# Put the country code into the variable
code = ['AFG'
        "BRN"
        "HKG"
       "KOR"
        "MHL"
        "NRU"
       "PHL"
        "THA"
fig = px.choropleth(combine
fig.show()
运行代码后,结果将如下所示:
电力来源
那么,从这些结果中我们可以解释什么呢?我们可以看到每个群集上都有一个独特的模式。
在群集0上,我们可以看到该群集上的成员来自属于太平洋地区以及马尔代夫的国家。在这个集群中,大多数电源依赖于燃料和太阳能。这是有道理的,因为大多数这些国家总是会暴露在阳光下。
在集群1中,我们可以看到该集群的成员来自东南亚,中亚以及巴布亚新几内亚。该集群主要使用燃料和水作为其电力来源。
在群集2中,属于该群集的国家/地区来自小型且人口稠密的国家,例如,香港和新加坡。但是也有像蒙古,土库曼斯坦这样的例外进入了这个集群。该集群中的国家大多使用燃料作为其电力来源。
在第3组中,属于该组的国家/地区主要来自东亚。例如,日本,印度,中国,泰国等等。他们正在使用几乎所有比例的所有电源。
最后,第4组来自主要使用水作为能源的国家。属于该集群的国家是越南,缅甸,老挝,乔治亚州,亚美尼亚等。对于一些内陆国家使用水作为电力来源,这是有意义的。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python 数据科学 初学者 transformed Categorical

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-30 20:21