没有任何东西是sklearn
为此而设计的,但是你可以使用一些小技巧来制作这样的分类器。
请注意,这些不一定适合您的问题,很难猜测什么对您的数据有用。
我首先想到的两个是 Knn 和随机森林,但你基本上可以调整任何多输出回归算法来做这些事情。
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.neighbors import NearestNeighbors
# Create some data to look like yours
n_samples = 100
n_features = 5
X = np.random.random((n_samples, n_features))
y_classifcation = np.random.random((n_samples, 2)).round()
y_regression = np.random.random((n_samples))
y = np.hstack((y_classifcation, y_regression[:, np.newaxis]))
现在我有一个包含两个二进制变量和一个连续变量的数据集
从 Knn 开始,你也可以这样做,KNeighborsRegressor
但我觉得这更好地说明了解决方案
# use an odd number to prevent tie-breaks
nn = NearestNeighbors(n_neighbors=5)
nn.fit(X, y)
idxs = nn.kneighbors(X, return_distance=False)
# take the average of the nearest neighbours to get the predictions
y_pred = y[idxs].mean(axis=1)
# all predictions will be continous so just round the continous ones
y_pred[:, 2] = y_pred[:, 2].round()
现在我们y_pred
是分类和回归的预测向量。所以现在让我们看一个随机森林。
# use an odd number of trees to prevent predictions of 0.5
rf = RandomForestRegressor(n_estimators=11)
rf.fit(X, y)
y_pred = rf.predict(X)
# all predictions will be continous so just round the continous ones
y_pred[:, 2] = y_pred[:, 2].round()
我会说这些“黑客”是相当合理的,因为它们与这些算法的分类设置的工作方式相差不远。
如果你有一个热编码的多类问题,那么不要像我上面所做的那样将概率四舍五入到二进制类,你需要选择概率最高的类。你可以很简单地使用这样的东西来做到这一点
n_classes_class1 = 3
n_classes_class2 = 4
y_pred_class1 = np.argmax(y_pred[:, :n_classes_class1], axis=1)
y_pred_class2 = np.argmax(y_pred[:, n_classes_class1:-1], axis=1)