我试图在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]. 我认为错误发生在数组操作的某个地方。我很难修好它。有什么建议/见解/建议吗?
编辑:下面是示例"test“列。不知道如何把它写成表格格式。很抱歉那些糟糕的视觉效果。
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发布于 2018-03-06 16:07:35
那么,看看test以及您创建features和target的方式,很明显,特性的数量和目标的数量是不同的。我想你可能对这两件事的含义感到困惑。
对于给定的记录,您将拥有一组描述该记录的特性和一个目标,表示您知道该记录在哪个类中。所以,如果你想预测谁会在泰坦尼克号上生存下来,你的特征可能是这样的:寄宿班、人的年龄、性别和目标是天气,他们是否幸存。
对于每个人,你需要他们的特征和他们的目标。然后,分类器将对特征和目标进行培训,以了解特征中的哪些模式与哪个目标相关联。然后,当您看到一个新的示例,其中您知道特性而不是目标时,predict方法将获取所学习的模式,并返回它对目标可能是什么(或者更确切地说,目标的每个可能值的概率)的最佳猜测。
目标不是你要填写的数据。这是已知的结果,例如,你可以用它来教算法如何猜测未知的值。在训练阶段,你必须告诉算法答案应该是什么。
你想要做的不是分类问题,而是试图“推断缺失的值”。这需要一种与您所尝试的完全不同的方法。
如果您的数据是一个时间序列(也就是说,每个值都是从某个时间点获取的,以便进行某种测量),那么您可以考虑使用移动平均值(ARMA或ARIMA)或“指数平滑”来计算丢失的值。
不过,根据您的目的,您也可能只需要取周围值的平均值,或者几个周围值的中值。
https://stackoverflow.com/questions/48956602
复制相似问题