标签: feature-selection

在Scikit功能选择后保留功能名称

在从一组数据上运行Scikit-Learn的方差阈值后,它会删除一些功能.我觉得我在做一些简单而又愚蠢的事情,但我想保留其余功能的名称.以下代码:

def VarianceThreshold_selector(data):
    selector = VarianceThreshold(.5) 
    selector.fit(data)
    selector = (pd.DataFrame(selector.transform(data)))
    return selector
x = VarianceThreshold_selector(data)
print(x)
Run Code Online (Sandbox Code Playgroud)

更改以下数据(这只是行的一小部分):

Survived    Pclass  Sex Age SibSp   Parch   Nonsense
0             3      1  22   1        0        0
1             1      2  38   1        0        0
1             3      2  26   0        0        0
Run Code Online (Sandbox Code Playgroud)

进入这个(再次只是行的一小部分)

     0         1      2     3
0    3      22.0      1     0
1    1      38.0      1     0
2    3      26.0      0     0
Run Code Online (Sandbox Code Playgroud)

使用get_support方法,我知道这些是Pclass,Age,Sibsp和Parch,所以我宁愿返回更像:

     Pclass         Age      Sibsp     Parch
0        3          22.0         1         0
1        1          38.0         1         0 …
Run Code Online (Sandbox Code Playgroud)

python feature-selection pandas scikit-learn output

12
推荐指数
3
解决办法
9189
查看次数

处理具有重复多值特征的数据集

我们有一个稀疏表示的数据集,具有25个功能和1个二进制标签。例如,一行数据集是:

Label: 0
exid: 24924687
Features:
11:0 12:1 13:0 14:6 15:0 17:2 17:2 17:2 17:2 17:2 17:2
21:11 21:42 21:42 21:42 21:42 21:42 
22:35 22:76 22:27 22:28 22:25 22:15 24:1888
25:9 33:322 33:452 33:452 33:452 33:452 33:452 35:14
Run Code Online (Sandbox Code Playgroud)

因此,有时功能具有多个值,它们可以相同或不同,并且网站上说:

一些分类特征是多值的(顺序无所谓)

我们不知道功能的语义和分配给它们的价值(由于某些隐私问题,它们对公众隐藏)

我们只知道:

  • Label 表示用户是否点击了推荐广告。
  • Features 正在描述已推荐给用户的产品。
  • Task 在给定产品广告的情况下,用于预测用户获得点击的可能性。

感谢对以下问题的任何评论:

  1. 将此类数据集导入Python数据结构的最佳方法是什么。
  2. 如何处理多值特征,特别是当它们具有相似的值重复k多次时?

python scipy multivalue-database feature-selection

12
推荐指数
1
解决办法
310
查看次数

从 SHAP 值中获取特征重要性

我想获得一个包含重要功能的数据框。通过下面的代码,我得到了 shap_values,但我不确定这些值的含义是什么。在我的 df 中有 142 个特征和 67 个实验,但得到了一个带有 ca 的数组。2500 个值。

explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_test)

shap.summary_plot(shap_values, X_test, plot_type="bar")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我尝试将它们存储在 df 中:

rf_resultX = pd.DataFrame(shap_values, columns = ['shap_values'])
Run Code Online (Sandbox Code Playgroud)

但得到: ValueError: 传递值的形状是 (18, 142),索引意味着 (18, 1)

142 - 特征的数量。18 - 我不知道。

我相信它的工作原理如下:

  • shap_values 需要取平均值。
  • 并与功能名称配对: pd.DataFrame(feature_names, columns = ['feature_names'])

有人有经验,如何解释 shap_values 吗?起初我认为,值的数量是特征数 x 行数。

python feature-selection random-forest

12
推荐指数
2
解决办法
3万
查看次数

选择功能以将Twitter问题标识为"有用"

我通过使用正则表达式从Twitter的流中收集了一堆问题来挑选任何包含以问题类型开头的文本的推文:谁,什么,何时,何地等,并以问号结束.

因此,我最终在我的数据库中得到了几个无用的问题:"谁在乎?","这是什么?" 等一些有用的东西,比如:'篮球比赛的频率是多少?','北极熊的重量是多少?' 等等

但是,我只对有用的问题感兴趣.

我有大约3000个问题,〜2000个问题没用,〜其中1000个是有用的,我手动标记它们.我试图使用一个朴素的贝叶斯分类器(随NLTK一起)尝试自动分类问题,这样我就不必手动挑选出有用的问题.

首先,我尝试选择问题的前三个单词作为功能,但这并没有多大帮助.在100个问题中,分类器仅预测大约10%-15%对于有用的问题是正确的.它也未能从它预测无用的问题中挑选出有用的问题.

我尝试了其他功能,例如:包括所有单词,包括问题的长度,但结果没有显着变化.

有关如何选择功能或继续进行的任何建议?

谢谢.

classification machine-learning nltk feature-selection

11
推荐指数
1
解决办法
2194
查看次数

在TF和TF*IDF向量上执行Chi-2特征选择

我正在尝试一些文本分类任务的Chi-2特征选择.我理解Chi-2测试检查B/T两个分类变量的依赖关系,所以如果我们用二进制BOW矢量表示对二进制文本分类问题执行Chi-2特征选择,每个(特征,类)的每个Chi-2测试对将是一个非常直接的Chi-2测试,具有1个自由度.

引自文档:http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.chi2.html#sklearn.feature_selection.chi2,

该分数可用于选择具有来自X的χ2(卡方)统计值的最高值的n_features特征,其必须包含相对于类的布尔值或频率(例如,文档分类中的术语计数).

在我看来,我们也可以在DF(字数)矢量表示上执行Chi-2特征选择.我的第一个问题是:sklearn如何将整数值特征离散化为分类?

我的第二个问题与第一个问题类似.从这里的演示代码:http://scikit-learn.sourceforge.net/dev/auto_examples/document_classification_20newsgroups.html

在我看来,我们也可以在TF*IDF矢量表示上执行Chi-2特征选择.sklearn如何在实值特征上执行Chi-2特征选择?

提前感谢您的善意建议!

machine-learning feature-selection scikit-learn

11
推荐指数
1
解决办法
6805
查看次数

随机森林的varImp(插入符号)和重要性(randomForest)之间的差异

我不明白随机森林模型的varImp函数(caret包)和importance函数(randomForest包)之间的区别是什么:

我计算了一个简单的RF分类模型,当计算变量重要性时,我发现两个函数的预测变量的"排名"并不相同:

这是我的代码:

rfImp <- randomForest(Origin ~ ., data = TAll_CS,
                       ntree = 2000,
                       importance = TRUE)

importance(rfImp)

                                 BREAST       LUNG MeanDecreaseAccuracy MeanDecreaseGini
Energy_GLCM_R1SC4NG3        -1.44116806  2.8918537            1.0929302        0.3712622
Contrast_GLCM_R1SC4NG3      -2.61146974  1.5848150           -0.4455327        0.2446930
Entropy_GLCM_R1SC4NG3       -3.42017102  3.8839464            0.9779201        0.4170445
...

varImp(rfImp)
                                 BREAST        LUNG
Energy_GLCM_R1SC4NG3         0.72534283  0.72534283
Contrast_GLCM_R1SC4NG3      -0.51332737 -0.51332737
Entropy_GLCM_R1SC4NG3        0.23188771  0.23188771
...
Run Code Online (Sandbox Code Playgroud)

我以为他们使用相同的"算法"但我现在不确定.

编辑

为了重现该问题,ionosphere可以使用数据集(kknn包):

library(kknn)
data(ionosphere)
rfImp <- randomForest(class ~ ., data = ionosphere[,3:35],
                       ntree = 2000,
                       importance = TRUE) …
Run Code Online (Sandbox Code Playgroud)

r feature-selection random-forest r-caret

11
推荐指数
2
解决办法
1万
查看次数

scikit learn - 在决策树中进行特征重要性计算

我试图了解如何计算sci-kit学习中的决策树的特征重要性.之前已经问过这个问题,但我无法重现算法提供的结果.

例如:

from StringIO import StringIO

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree.export import export_graphviz
from sklearn.feature_selection import mutual_info_classif

X = [[1,0,0], [0,0,0], [0,0,1], [0,1,0]]

y = [1,0,1,1]

clf = DecisionTreeClassifier()
clf.fit(X, y)

feat_importance = clf.tree_.compute_feature_importances(normalize=False)
print("feat importance = " + str(feat_importance))

out = StringIO()
out = export_graphviz(clf, out_file='test/tree.dot')
Run Code Online (Sandbox Code Playgroud)

导致特征重要性:

feat importance = [0.25       0.08333333 0.04166667]
Run Code Online (Sandbox Code Playgroud)

并给出以下决策树:

决策树

现在,这个答案对一个类似问题建议的重要性计算公式为

formula_a

其中G是节点杂质,在这种情况下是基尼杂质.据我所知,这是杂质减少.但是,对于功能1,这应该是:

formula_b

这个答案表明重要性由到达节点的概率加权(通过到达该节点的样本的比例来近似).同样,对于功能1,这应该是:

formula_c

两个公式都提供了错误的结果.如何正确计算特征重要性?

python decision-tree feature-selection scikit-learn

11
推荐指数
2
解决办法
1万
查看次数

sklearn逻辑回归 - 重要特征

我很确定之前有人问过,但我找不到答案

在python上使用sklearn运行Logistic回归,我可以使用Transform方法将我的数据集转换为最重要的特征

classf = linear_model.LogisticRegression()
func  = classf.fit(Xtrain, ytrain)
reduced_train = func.transform(Xtrain)
Run Code Online (Sandbox Code Playgroud)

如何判断哪些功能最重要?更一般地说,如何计算数据集中每个要素的p值?

python feature-selection scikit-learn

10
推荐指数
2
解决办法
2万
查看次数

Python的互信息实现

我在实现Python的机器学习库提供的互信息函数时遇到了一些问题,特别是:sklearn.metrics.mutual_info_score(labels_true,labels_pred,contingency = None)

(http://scikit-learn.org/stable/modules/generated/sklearn.metrics.mutual_info_score.html)

我正在尝试实现我在斯坦福NLP教程网站中找到的示例:

例

该网站位于:http://nlp.stanford.edu/IR-book/html/htmledition/mutual-information-1.html#mifeatsel2

问题是我不断得出不同的结果,但没有弄清楚原因.

我得到了相互信息和特征选择的概念,我只是不明白它是如何在Python中实现的.我所做的是我提供了基于NLP站点示例的两个数组的mutual_info_score方法,但它输出了不同的结果.另一个有趣的事实是无论如何你玩,并改变那些阵列上的数字,你最有可能得到相同的结果.我是否应该使用另一种特定于Python的数据结构或者背后的问题是什么?如果有人在过去成功使用过这个功能,对我来说将是一个很大的帮助,谢谢你的时间.

python machine-learning feature-selection

10
推荐指数
1
解决办法
1万
查看次数

将自定义函数放入 Sklearn 管道中

在我的分类方案中,有几个步骤,包括:

  1. SMOTE(合成少数过采样技术)
  2. 特征选择的 Fisher 标准
  3. 标准化(Z-score 标准化)
  4. SVC(支持向量分类器)

在上述方案中要调整的主要参数是百分位数 (2.) 和 SVC (4.) 的超参数,我想通过网格搜索进行调整。

当前的解决方案构建了一个“部分”管道,包括方案中的第 3 步和第 4 步,并将方案clf = Pipeline([('normal',preprocessing.StandardScaler()),('svc',svm.SVC(class_weight='auto'))]) 分解为两部分:

  1. 调整特征的百分位数以保持通过第一次网格搜索

    skf = StratifiedKFold(y)
    for train_ind, test_ind in skf:
        X_train, X_test, y_train, y_test = X[train_ind], X[test_ind], y[train_ind], y[test_ind]
        # SMOTE synthesizes the training data (we want to keep test data intact)
        X_train, y_train = SMOTE(X_train, y_train)
        for percentile in percentiles:
            # Fisher returns the indices of the selected features specified by the parameter 'percentile'
            selected_ind = Fisher(X_train, …
    Run Code Online (Sandbox Code Playgroud)

pipeline machine-learning feature-selection scikit-learn cross-validation

10
推荐指数
2
解决办法
2万
查看次数