如何在聚类分析中处理空值?
Posted
技术标签:
【中文标题】如何在聚类分析中处理空值?【英文标题】:How do I handle null values in cluster analysis? 【发布时间】:2021-12-19 06:35:41 【问题描述】:我从事金融科技业务,我拥有如下客户级别的数据:
Customer ID | day1 | day2 | day3 | day4 |
---|---|---|---|---|
1 | 50 | 0 | NaN | 5 |
2 | NaN | 10 | NaN | NaN |
3 | -100 | -100 | 5 | 0 |
4 | 10 | -60 | 0 | 100 |
5 | 20 | NaN | -20 | NaN |
在上述数据中,行代表客户唯一 ID,列代表一年中的特定日期,值代表该特定日期的贷记和借记净额。
例如,对于 day1
上的客户 ID = 1
,credit = 100
和 debit = 50
因此净值为 50。零表示当天 credit = debit
。
NaN
在我的数据中简单地显示,在那一天,客户没有通过应用程序进行任何贷记或借记交易,这对我来说很重要。让NaN
成为NO INTERACTION的实例。
现在我的问题是如何告诉 scikit-learn python 中的 K-Means 将 NaN 值视为无交互?我不想消除 NaN
值。我也不想用平均值或中值替换 NaN
值。 NaN
值是我的附加信息,我如何保留这些信息?
【问题讨论】:
也许您可以为每一天添加一个列,指示当天是否有交互,如果有交互,则将其设置为 1,如果没有交互,则设置为 0。对于没有互动的日子,您将净信用列中的 nan 值替换为 0,因为当天的净信用为零。 这是related question。 【参考方案1】:import numpy as np
df_no = df.replace(np.nan, 'no', regex=True)
【讨论】:
【参考方案2】:k-means等聚类方法使用距离(Euclidean distance)进行计算。
要计算距离,你需要数字,所有的东西都必须是量化的。
确切地说,您必须删除那些或用最佳代表(中位数或平均值或 0)替换那些 NaN 值。
我该如何决定?
您认为哪个客户更接近 1 号客户?
客户 2、3 还是 4?
Customer ID | day1 | day2 | day3 | day4 |
---|---|---|---|---|
1 | 50 | 0 | NaN | 5 |
2 | 50 | 0 | 0 | 5 |
3 | 50 | 0 | median | 5 |
4 | 50 | 0 | mean | 5 |
【讨论】:
以上是关于如何在聚类分析中处理空值?的主要内容,如果未能解决你的问题,请参考以下文章