gpt4 book ai didi

python - 使用预测模型估算缺失值

转载 作者:太空狗 更新时间:2023-10-30 01:12:54 26 4
gpt4 key购买 nike

我试图在 Python 中估算缺失值,而 sklearn 似乎没有超出平均(均值、中值或众数)估算的方法。 Orange imputation model似乎提供了一个可行的选择。但是,Orange.data.Table 似乎无法识别 np.nan 或者插补失败。

import Orange
import numpy as np

tmp = np.array([[1, 2, np.nan, 5, 8, np.nan], [40, 4, 8, 1, 0.2, 9]])
data = Orange.data.Table(tmp)
imputer = Orange.feature.imputation.ModelConstructor()
imputer.learner_continuous = Orange.classification.tree.TreeLearner(min_subset=20)
imputer = imputer(data )
impdata = imputer(data)
for i in range(0, len(tmp)):
print impdata[i]

输出是

[1.000, 2.000, 1.#QO, 5.000, 8.000, 1.#QO]
[40.000, 4.000, 8.000, 1.000, 0.200, 9.000]

知道我错过了什么吗?谢谢!

最佳答案

问题似乎是 Orange 中的缺失值表示为 ?~。奇怪的是,Orange.data.Table(numpy.ndarray) 构造函数没有推断出 numpy.nan 应该转换为 ?~ 并将它们转换为 1.#QO。下面的自定义函数 pandas_to_orange() 解决了这个问题。

import Orange
import numpy as np
import pandas as pd

from collections import OrderedDict

# Adapted from https://github.com/biolab/orange3/issues/68

def construct_domain(df):
columns = OrderedDict(df.dtypes)

def create_variable(col):
if col[1].__str__().startswith('float'):
return Orange.feature.Continuous(col[0])
if col[1].__str__().startswith('int') and len(df[col[0]].unique()) > 50:
return Orange.feature.Continuous(col[0])
if col[1].__str__().startswith('date'):
df[col[0]] = df[col[0]].values.astype(np.str)
if col[1].__str__() == 'object':
df[col[0]] = df[col[0]].astype(type(""))
return Orange.feature.Discrete(col[0], values = df[col[0]].unique().tolist())
return Orange.data.Domain(list(map(create_variable, columns.items())))

def pandas_to_orange(df):
domain = construct_domain(df)
df[pd.isnull(df)]='?'
return Orange.data.Table(Orange.data.Domain(domain), df.values.tolist())

df = pd.DataFrame({'col1':[1, 2, np.nan, 4, 5, 6, 7, 8, 9, np.nan, 11],
'col2': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110.]})

tmp = pandas_to_orange(df)
for i in range(0, len(tmp)):
print tmp[i]

输出是:

[1.000, 10.000]
[2.000, 20.000]
[?, 30.000]
[4.000, 40.000]
[5.000, 50.000]
[6.000, 60.000]
[7.000, 70.000]
[8.000, 80.000]
[9.000, 90.000]
[?, 100.000]
[11.000, 110.000]

我想对缺失值进行正确编码的原因是我可以使用 Orange 插补库。然而,库中的预测树模型似乎只做简单的均值插补。具体来说,它为所有缺失值归因相同的值。

imputer = Orange.feature.imputation.ModelConstructor()
imputer.learner_continuous = Orange.classification.tree.TreeLearner(min_subset=20)
imputer = imputer(tmp )
impdata = imputer(tmp)
for i in range(0, len(tmp)):
print impdata[i]

这是输出:

[1.000, 10.000]
[2.000, 20.000]
[5.889, 30.000]
[4.000, 40.000]
[5.000, 50.000]
[6.000, 60.000]
[7.000, 70.000]
[8.000, 80.000]
[9.000, 90.000]
[5.889, 100.000]
[11.000, 110.000]

我一直在寻找适合模型(例如 kNN)的完整案例,并使用拟合模型来预测缺失案例。 fancyimpute (a Python 3 package)执行此操作但在我的 300K+ 输入上抛出 MemoryError

from fancyimpute import KNN

df = pd.DataFrame({'col1':[1, 2, np.nan, 4, 5, 6, 7, 8, 9, np.nan, 11],
'col2': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110.]})

X_filled_knn = KNN(k=3).complete(df)
X_filled_knn

输出是:

array([[   1.        ,   10.        ],
[ 2. , 20. ],
[ 2.77777784, 30. ],
[ 4. , 40. ],
[ 5. , 50. ],
[ 6. , 60. ],
[ 7. , 70. ],
[ 8. , 80. ],
[ 9. , 90. ],
[ 9.77777798, 100. ],
[ 11. , 110. ]])

我可能会找到解决方法或将数据集拆分成 block (不太理想)。

关于python - 使用预测模型估算缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39320135/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com