如何选择或优化标签,以便获得更好的多类分类结果?


狗头军师
2025-03-24 12:14:24 (15天前)

最近,我正在进行一个Kaggle项目“审慎人寿评估”,竞争对手在谈论如何更改标签以获取更好的指标。

在那个特定的比赛中,目标有8个类别(1-8),但是其中一个人使用了不同的标签,(-1.6, 0.7, 0.3, 3.15, 4.53, 6.5, 6.77, 9.0)或者他们使用了另一个示例[-1.6, 0.7, 0.3, 3.15, 4.53, 6.5, 6.77, 9.0]来代替[1,2,3,4,5,6,7,8]。

我想知道如何得出这些魔术数字?

我愿意接受任何想法/技巧/建议来进行此类转换。输入非常感谢!

范例程式码
</p><h1><a href="#imports" name="imports">imports</a></h1><p>import numpy as np<br/>import pandas as pd<br/>import seaborn as sns<br/>import xgboost as xgb<br/>from sklearn import metrics<br/>from sklearn.model_selection import train_test_split</p><h1><a href="#data" name="data">data</a></h1><p>df = sns.load_dataset(‘iris’)<br/>df[‘species’] = pd.factorize(df[‘species’])[0]<br/>df = df.sample(frac=1,random_state=100)</p><h1><a href="#train-test-split" name="train-test-split">train test split</a></h1><p>X = df.drop(‘species’,axis=1)<br/>y = df[‘species’]<br/>Xtrain, Xtest, ytrain, ytest = train_test_split(X,y,stratify=y,random_state=100)</p><h1><a href="#modelling" name="modelling">modelling</a></h1><p>model = xgb.XGBClassifier(objective=‘multi:softprob’, random_state=100)<br/>model.fit(Xtrain, ytrain)<br/>preds = model.predict(Xtest)<br/>kappa = metrics.cohen_kappa_score(ytest, preds, weights=‘quadratic’)</p><p>print(kappa)<br/>
我的想法
标签实际上可以包含无限个数,如何转换[1-8]为[x-y]?

我们是否应该随机选择8个数字并检查所有kappa。似乎是最非理性的想法,可能永远不会起作用。

为此有某种梯度下降方法吗?也许不是,只是一个想法。

2 条回复
  1. 1# v-star*위위 | 2020-08-23 15-19

    您问题中的第一个链接实际上包含答案:

    #通过使用模拟退火优化CV得分获得硬编码值

    后来作者也评论:

    最初,我是一个一个地优化参数,但是后来我切换到通过网格搜索和模拟退火相结合来同时优化它们。我不确定即使在模拟退火的各种设置下都可以找到CV分数的全局最大值。也许遗传算法会有所帮助。

    第二个链接的解决方案具有相同的值,因为(有可能)作者从第一个解决方案中复制了它们(请参阅其注释):

    灵感来源:https : //www.kaggle.com/mariopasquato/prudential-life-insurance-assesssment/linear-model/code

    简而言之-您可以将这些值视为它们是学习算法的元参数(好吧,它们是)。这样,您可以定义一个函数F(metaparameters),以便计算该函数的单个值,您需要对训练集进行全面训练,并在验证集上进行输出损失(或者最好使用n倍交叉验证并使用CV损失)。然后,您的任务就变得非常F繁琐,可以使用您喜欢的任何优化方法以某种方式找到最佳的元参数集-例如,第一个解决方案的作者声称他们使用了网格搜索和模拟退火。

    没有针对优化本身进行元调整的小示例:

    import numpy as np
    cnt = 0
    def use_a_function_which_calls_training_and_computes_cv_instead_of_this(x):
    global cnt
    cnt += 1
    return ((x - np.array([-1.6, 0.7, 0.3, 3.15, 4.53, 6.5, 6.77, 9.0]))**2).sum()

    my_best_guess_for_the_initial_parameters = np.array([1.,2.,3.,4.,5.,6.,7.,8.])
    optimization_results = scipy.optimize.basinhopping(
    use_a_function_which_calls_training_and_computes_cv_instead_of_this,
    my_best_guess_for_the_initial_parameters,
    niter=100)
    print(“Times function was called: {0}”.format(cnt))
    print(optimization_results.x)
    输出示例:

    Times function was called: 3080
    [-1.6 0.7 0.3 3.15 4.52999999 6.5
    6.77 8.99999999]
    您可能很想尝试优化本身的参数,甚至可能编写您的自定义优化器和/或回调以进行步骤。但是,即使默认参数也至少可以在某种程度上为您工作。如果您花太多时间对函数进行一次计算,则可以例如尝试使用较小的全部数据子集进行初始优化,等等。

登录 后才能参与评论