是否有一组神奇的参数序列,可以让模型从之前未见过的数据中正确推断?
from sklearn.neural_network import MLPClassifierclf = MLPClassifier( activation='logistic', max_iter=100, hidden_layer_sizes=(2,), solver='lbfgs')X = [[ 0, 0], # 2 samples, 3 features [0, 1],# [1, 0], [1, 1]]y = [0, 1,# 1, 0] # classes of each sampleclf.fit(X, y)assert clf.predict([[0, 1]]) == [1]assert clf.predict([[1, 0]]) == [1]
回答:
使用核函数如何?核函数是一种模型从数据中提取所需特征的方式。
通常使用的核函数可能无法满足你的需求。我认为它们试图在包含[0, 0]
和[1, 1]
的一个超平面与包含[0, 1]
的另一个超平面之间找到‘切割’超平面。
例如,在二维空间中,一个超平面是y = x
,另一个超平面是y = x + 1
。那么‘切割’超平面可能是y = x + 1/2
。
所以我建议使用以下核函数。
def kernel(X1, X2): X1 = np.array([[(x[0] - x[1]) ** 2] for x in X1]) X2 = np.array([[(x[0] - x[1]) ** 2] for x in X2]) return np.dot(X1, X2.T)
这个核函数的作用是这样的。它对两个标量之间的差异进行平方处理,即(x – y)2。通过这种特征提取方式,数据将被特征化为如下形式:
[0, 0]
→[0]
[0, 1]
→[1]
[1, 1]
→[0]
对于未见过的数据也是如此:
[1, 0]
→[1]
因此,以下训练过的分类器将如你所愿地进行predict
操作;([1, 0]
→ [1]
)。
clf = svm.SVC(kernel=kernel, max_iter=100)
在机器学习中,模型选择非常重要。一个不知道[0, 0]
和[1, 1]
属于同一组,而[0, 1]
和[1, 0]
属于另一组的模型,可能无法做出你期望的预测。