有机会学习机器学习中的缺失值吗?

时间:2018-04-16 10:06:07

标签: python machine-learning imputation

对于个人知识,我一直在尝试除平均值/中位数/模式之外的其他插补方法。到目前为止,我能够尝试KNN,MICE,中位数归集方法。我被告知也可以通过聚类方法进行估算,并且我的互联网搜索找到了一个只用于研究论文的软件包。

我在Iris数据集上运行这些归因方法,通过在其中单独创建缺失值(因为Iris没有缺失值)。我对其他方法的处理方法如下:

data = pd.read_csv("D:/Iris_classification/train.csv")

#Shuffle the data and reset the index
from sklearn.utils import shuffle
data = shuffle(data).reset_index(drop = True)  

#Create Independent and dependent matrices
X = data.iloc[:, [0, 1, 2, 3]].values 
y = data.iloc[:, 4].values

#train_test_split
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 50, random_state = 0)

#Standardize the data
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()

X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

#Impute missing values at random
prop = int(X_train.size * 0.5) #Set the % of values to be replaced
prop1 = int(X_test.size * 0.5)

a = [random.choice(range(X_train.shape[0])) for _ in range(prop)] #Randomly choose indices of the numpy array
b = [random.choice(range(X_train.shape[1])) for _ in range(prop)]

X1_train[a, b] = np.NaN
X1_test[c, d] = np.NaN

然后对于KNN估算,我已经完成了

X_train_filled = KNN(3).complete(X_train)
X_test_filled = KNN(3).complete(X_test

有没有办法通过聚类方法来估算缺失值? 此外,当StandardScaler()中存在NaN值时,它不起作用。有没有其他方法来标准化数据?

2 个答案:

答案 0 :(得分:1)

我们必须处理的主要问题是您有一些缺失的数据。

首先,我需要告诉你,删除"问题"线条可能非常危险,因为它们可能包含重要信息。

  

有没有办法通过群集来估算缺失值?

是的,您可以用列中所有值的平均值替换丢失的数据。

您可以使用Inputer库中的sklearn.preprocessing类来执行此操作。

from sklearn.preprocessing import Imputer
inputer = Inputer(missing_values = 'NaN', strategy = 'mean', axis = 0)
inputer = inputer.fit(X)
X = inputer.transform(X)

你必须在"创建独立和依赖矩阵之后立即使用这种方法" ,缩放之前和其他人。

我在下面创建了一个简单的示例,以向您展示它是如何工作的:

<强>之前

enter image description here

<强>后

enter image description here

答案 1 :(得分:0)

您是否看过fancyimpute软件包https://github.com/iskandr/fancyimpute?它提供KNN,MICE,矩阵分解以及其他一些功能。

还有一个虚拟的https://github.com/eltonlaw/impyute,我个人没有使用过,但是SciPy的演示者告诉我他在fancyimpute无法编译时使用了它。它似乎比fancyimpute具有更好的文档记录,尽管选项更少。

除此之外,Python中没有大量优秀的插补库。这是R真正超越Python的领域,它具有出色的插补包,例如Amelia和MICE。