我想知道如何在多标签分类问题中提高准确度分数并降低损失。
如果您查看 sklearn 参考文献,就会发现多类和多输出算法中提到了多标签,我现在正在测试它。 (https://scikit-learn.org/stable/modules/multiclass.html)
样本数据使用sklearn.datasets中的make_multilabel_classification有10个特征,并通过修改n_classes创建数据集。
当multilabel中有两个类时,看起来准确率和损失还是有些令人满意的。
from numpy import mean
from numpy import std
from sklearn.datasets import make_multilabel_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, hamming_loss
# define dataset
X, y = make_multilabel_classification(n_samples=10000, n_features=10, n_classes=2, random_state=1)
# summarize dataset shape
print(X.shape, y.shape)
# summarize first few examples
for i in range(10):
print(X[i], y[i])
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=101)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
print(scaler.mean_)
print(scaler.var_)
x_train_std = scaler.transform(X_train)
x_test_std = scaler.transform(X_test)
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(x_train_std, y_train)
pred = knn.predict(x_test_std)
print(accuracy_score(y_test, pred))
print(hamming_loss(y_test, pred))
accuracy_score:0.8345,hamming_loss:0.08875
但是,随着类数超过3,准确率分数逐渐下降,损失增加。
# define dataset
X, y = make_multilabel_classification(n_samples=10000, n_features=10, n_classes=3, random_state=1)
n_classes= 3 --> 准确度得分:0.772,汉明损失:0.116
n_classes= 4 --> 准确度得分:0.4875,汉明损失:0.194125
使用 RandomForestClassifier 算法和 MLPClassifier 算法时也类似,如参考文献所示,或者使用 ClassifierChain(estimator=SVC) 使用不支持 Multilabel 分类的算法时。
我应该调整哪些超参数来提高准确性?
在处理包含匿名特征和记录的数据时,建议使用网格搜索通过超参数调整来确定最佳参数。 Sklearn 提供了各种超参数调整系统,其中 GridSearchCV 因其功效而脱颖而出。与随机搜索相比,它通常会在更短的时间内产生更好的结果。然而,这些方法之间的选择最终取决于所使用的特定数据集。
要利用网格搜索,应该以字典格式定义潜在参数,并将它们与模型一起提供给 GridSearchCV
from sklearn.model_selection import GridSearchCV
# define hypertuning parameters
parameters = {'n_neighbors':[3, 5, 10, 15]}
knn = KNeighborsClassifier()
clf = GridSearchCV(knn, parameters)
# Fit the GridSearchCV object to the data
clf.fit(X_train, y_train)
# Get the best parameters
best_params = clf.best_params_
print("Best parameters found:", best_params)
随意为模型添加更多调整参数。有关 GridSearchCV 的更多信息,请参阅页面。