1

我正在尝试在 Python 中实现决策树算法来预测丢失的输入数据。

假设我有一列有 99 个条目。在这 99 个条目中,有 20 个是 NaN。我想将这个单个数组分解为 x 个大小为 y(在本例中为 y = 5)的子数组。

具有完整单元格的子数组分配给特征,包含NaN的子数组分配给目标

 # breaking target array into subarrays
subarray_size = 5
target = []
features = []

# complete break up and assign to array "chunks"
chunks = [test[x : x + subarray_size] for x in xrange(0, len(test), subarray_size)]

# assigns NaN containg subarray to "target" and filled subarrays to "features"
for i in chunks:
    if (np.where(np.isnan(i)))[0].shape[0]: 
        target.append(i)
    else:
        features.append(i)

代码一直工作到 for 循环结束。现在我有了特性目标,我尝试了下面的代码块

from sklearn.cross_validation import train_test_split as tts

X_train, X_test, y_train, y_test = tts(features, target, test_size=0.2)

这产生了这个错误:

    202     if len(uniques) > 1:
    203         raise ValueError("Found input variables with inconsistent numbers of"
--> 204                          " samples: %r" % [int(l) for l in lengths])
    205 
    206 

ValueError: Found input variables with inconsistent numbers of samples: [5, 15]. 

我认为错误发生在数组操作期间的某个地方。我很难修复它。有什么建议/见解/建议吗?

编辑:下面是示例“测试”列。不知道如何把它放在表格格式中。对不起,糟糕的视觉效果。

Site2_ThirdIonizationEnergy

39.722
39.722
33.667
39.722
39.722
23.32
25.04
NaN
27.491
22.99
39.722
23.32
25.04
NaN
27.491
22.99
33.667
23.32
33.667
NaN
27.491
22.99
39.722
23.32
25.04
NaN
27.491
22.99
19.174
19.174
19.174
19.174
39.722
39.722
33.667
39.722
39.722
23.32
25.04
NaN
27.491
22.99
39.722
23.32
25.04
NaN
27.491
22.99
33.667
23.32
33.667
NaN
27.491
22.99
39.722
23.32
25.04
NaN
27.491
22.99
39.722
39.722
33.667
39.722
39.722
39.722
33.667
39.722
39.722
23.32
25.04
NaN
27.491
22.99
39.722
23.32
25.04
NaN
27.491
22.99
33.667
23.32
33.667
NaN
27.491
22.99
39.722
23.32
25.04
NaN
27.491
22.99
21.62
21.62
21.62
21.62
39.722
39.722
33.667
4

1 回答 1

1

好吧,看看test你创建的方式featurestarget很明显特征的数量和目标的数量是不同的。我想你可能对这两个对象的含义感到困惑。

对于给定的记录,您将拥有一组描述该记录的特征和一个目标,表示您知道该记录属于哪个类别。因此,如果您试图预测谁将在泰坦尼克号中幸存下来,您的特征可能是诸如:寄宿等级、人的年龄、人的性别和目标将是天气或他们是否幸存下来。

对于每个人,您都需要他们的特征和目标。然后,您的分类器将对特征和目标进行训练,以了解特征中的哪些模式与哪些目标相关联。然后,稍后,当您看到一个您知道特征但不知道目标的新示例时,该predict方法将采用学习的模式并返回其对目标可能是什么的最佳猜测(或者更确切地说,每个可能值的概率目标)。

目标不是您要填写的数据。它是已知的结果,例如您将用来教算法如何猜测未知值的示例。在训练阶段,你必须告诉算法答案应该是什么。

您尝试做的不是分类问题,而是您尝试“估算缺失值”。这需要一种完全不同于您正在尝试的方法。

如果您的数据是时间序列(即,每个值都是从某个时间点获取某个测量值),那么您可以考虑使用移动平均值(ARMA 或 ARIMA)或“指数平滑”来估算缺失值。

但是,根据您的目的,您也可以只取周围值的平均值,或几个周围值的中值。

于 2018-03-06T16:07:35.377 回答