我有一个整数值的时间序列,我正试图预测它。我通过一个滑动窗口来实现这一点,它将学习关联99个值来预测下一个值。值介于0和128之间。x的表示是一个n个滑动窗口的立方体,长99,每个整数编码为一个128个元素的热编码向量。这个数组的形状是(n,99128)。Y的形状是(N,128)。我认为这是一个多层次的问题,因为Y可以精确地得到一个结果。
这对Keras/TensorFlow很好,但是当我尝试使用SciKit的RandomForest时,我发现它抱怨输入向量是3D而不是二维的,所以我将输入立方体x整形为二维形状矩阵(n,99*128)。结果不是很好,为了理解发生了什么,我请求概率(见下面的代码)。
def rf(X_train, Y_train, X_val, Y_val, samples):
clf = RandomForestClassifier(n_estimators=32, n_jobs=-1)
clf.fit(X_train, Y_train)
score = clf.score(X_val, Y_val)
print('Score of randomforest =', score)
# compute some samples
for i in range(samples):
index = random.randrange(0, len(X_val) - 1)
xx = X_val[index].reshape(1, -1)
probs = clf.predict_proba(xx)
pred = clf.predict(xx)
y_true = np.argmax(Y_val[index])
y_hat = np.argmax(pred)
print(index, '-', y_true, y_hat, xx.shape, len(probs))
print(probs)
print(pred)
我得到的输出
predict_proba
是:
[array([[0.841, 0.159]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1., 0.]]), array([[1., 0.]]), array([[1., 0.]]),
array([[1., 0.]]), array([[1., 0.]]), array([[0.995, 0.005]]), array([[0.999,
0.001]]), array([[0.994, 0.006]]), array([[1., 0.]]), array([[0.994, 0.006]]),
array([[0.977, 0.023]]), array([[0.999, 0.001]]), array([[0.939, 0.061]]),
array([[0.997, 0.003]]), array([[0.969, 0.031]]), array([[0.997, 0.003]]),
array([[0.984, 0.016]]), array([[0.949, 0.051]]), array([[1., 0.]]),
array([[0.95, 0.05]]), array([[1., 0.]]), array([[0.918, 0.082]]),
array([[0.887, 0.113]]), array([[1.]]), array([[0.88, 0.12]]), array([[1.]]),
array([[0.884, 0.116]]), array([[0.941, 0.059]]), array([[1.]]), array([[0.941,
0.059]]), array([[1.]]), array([[0.965, 0.035]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]]),
array([[1.]]), array([[1.]]), array([[1.]]), array([[1.]])]
输出向量的长度是128,但为什么它由一个包含二维数组的列表组成,有时包含一个元素,有时包含两个元素?据我所知
the manual
数组应该与维samples*类一起返回,所以在我的shape(1128)示例中。
有人能帮我指出我做错了什么吗?
编辑1
我按照@vivek kumar(感谢vivek)在他的评论中建议的方法做了实验。我输入整数序列(x)并将其与序列(y)中的下一个整数匹配。这是代码:
def rff(X_train, Y_train, X_val, Y_val, samples, cont=False):
print('Input data:', X_train.shape, Y_train.shape, X_val.shape, Y_val.shape)
clf = RandomForestClassifier(n_estimators=64, n_jobs=-1)
clf.fit(X_train, Y_train)
score = clf.score(X_val, Y_val)
y_true = Y_val
y_prob = clf.predict_proba(X_val)
y_hat = clf.predict(X_val)
print('y_true', y_true.shape, y_true)
print('y_prob', y_prob.shape, y_prob)
print('y_hat', y_hat.shape, y_hat)
#sum_prob = np.sum(y_true == y_prob)
sum_hat = np.sum(y_true == y_hat)
print('Score of randomforest =', score)
print('Score y_hat', sum_hat / len(X_val))
#print('Score y_prob', sum_prob / len(X_val))
# compute some individual samples
for i in range(samples):
index = random.randrange(0, len(X_val) - 1)
y_true_i = Y_val[index]
#y_prob_i = y_prob[index]
y_hat_i = y_hat[index]
print('{:4d} - {:3d}{:3d}'.format(index, y_true_i, y_hat_i))
其输出为:
Input data: (4272, 99) (4272,) (1257, 99) (1257,)
y_true (1257,) [ 0 0 0 ... 69 70 70]
y_prob (1257, 29) [[0.09375 0. 0. ... 0.078125 0.078125 0.015625]
[0.109375 0. 0. ... 0.046875 0.0625 0.0625 ]
[0.125 0. 0. ... 0.015625 0.078125 0.015625]
...
[0.078125 0. 0. ... 0. 0. 0. ]
[0.046875 0. 0. ... 0. 0. 0. ]
[0.078125 0. 0. ... 0. 0. 0. ]]
y_hat (1257,) [81 81 79 ... 67 67 65]
Score of randomforest = 0.20047732696897375
Score y_hat 0.20047732696897375
228 - 76 77
51 - 76 0
563 - 81 0
501 - 0 77
457 - 79 79
285 - 76 77
209 - 81 0
1116 - 79 0
178 - 72 77
1209 - 67 65
Probabilities数组的大小是一致的,但是它的形状是完全奇怪的(128,29)。这29个是从哪里来的…?然而,还有一些改进需要报告:准确性已经大大提高了。以前是0.0015左右,现在是0.20左右。
关于概率数组代表什么有什么想法吗?
编辑2
我的错误是,从128返回一个热编码值到整数,我没有考虑到我只有29个唯一值。
预测可能性
巧妙地预测这29个值,因为这些是它学到的。
唯一剩下的问题是概率预测哪些值?假设要预测的类是0,101-128,
预测可能性
返回索引0..28的值。概率到类的映射是什么:0-->0,1-->101,2-->102,…,29-128?我在手册中找不到任何关于这个的提示。