使用类权重时不同的重要性特征和 aoc

Posted

技术标签:

【中文标题】使用类权重时不同的重要性特征和 aoc【英文标题】:Different importance features and aoc when using class weights 【发布时间】:2018-05-07 05:20:54 【问题描述】:

我正在使用 scikit learn,代码如下所示。

我的班级不平衡(大约 90:10 的班级比例为 0:1)。在阅读了许多其他问题后,我使用了 class_weighted 参数。

但是,每次我运行代码时,我都会得到一组不同的重要特性和不同的 AOC、精度、召回率等。

当我删除 class_weight 参数时,问题就不存在了。

如图所示,我已将 random_state 设置为常量,因此这不是问题。很多预测变量是高度相关的。有谁知道问题是什么? (注意我昨天发布了一个类似的问题,但由于我不够清楚,所以我删除了这个问题,希望其他人更清楚,现在提供所需的信息,而不是有一长串的 cmets。 /p>

x_train, x_test, y_train, y_test = train_test_split(x, y)

parameters = 
    'max_depth': [6,7, 8],
    'min_samples_split': [100, 150],
    'min_samples_leaf': [50,75]
    

clf = GridSearchCV(DecisionTreeClassifier(
    random_state=99,
    class_weight='balanced'), 
    parameters, refit=True, cv=10) 

clf.fit(x_train, y_train.ravel()

# create main tree using best settings
clf2 = DecisionTreeClassifier(
    max_depth=clf.best_params_['max_depth'],
    min_samples_split=clf.best_params_['min_samples_split'],
    min_samples_leaf=clf.best_params_['min_samples_leaf'],
    random_state=99,
    class_weight='balanced')

clf2.fit(x_train, y_train.ravel()) 

【问题讨论】:

正如我在上一个(现已删除)问题中所说的那样。仅在一处设置 random_state 不会使代码重复。您需要检查拆分。 train_test_split 也使用随机混洗对数据进行混洗然后拆分。所以这是一个随机的地方。那么GridSearchCV也会因为cv参数而具有随机性。 啊,我现在明白你的意思了!是的,你是对的-谢谢。正如我所说,我对这一切都很陌生,不知道这可能是问题的原因。标记为已回答。 【参考方案1】:

在上面的代码中,有多个随机点。

1) train_test_split 使用随机混洗对数据进行混洗,然后拆分为训练和测试。所以首先你需要稳定它。

2) GridSearchCV 使用cv 参数,对于分类任务,该参数使用 StratifiedKFold() 将数据拆分为不同的折叠。所以这也是随机性。

解决方法:请在处理数据之前在代码中设置此行(最好在顶部,就在导入行的下方)。

numpy.random.seed(SOME_INTEGER)

使用已导入的numpynp

说明:请看以下问题:-

Should I use `random.seed` or `numpy.random.seed` to control random number generation in `scikit-learn`? How to seed the random number generator for scikit-learn?

【讨论】:

以上是关于使用类权重时不同的重要性特征和 aoc的主要内容,如果未能解决你的问题,请参考以下文章

如何手动为 SVM 中的某些特征分配权重?

Scikit 学习模型赋予随机变量权重?我应该删除不太重要的功能吗?

AdaBoost元算法

特征选择

Scikits Learn:线性核 SVM 中的特征权重

TermWeight 词权重算法