【问题标题】:Code enters infinite loop when trying to select features尝试选择特征时代码进入无限循环
【发布时间】:2021-03-11 03:58:10
【问题描述】:

我正在尝试使用 scikit learn 的递归特征消除和交叉验证来处理具有二进制类问题的 (5000, 37) 数据,并且每当我拟合模型时,算法就会进入无限循环。 目前,我正在关注这个例子:https://scikit-learn.org/stable/auto_examples/feature_selection/plot_rfe_with_cross_validation.html 关于如何使用这个算法。

我的数据是:

    from sklearn.svm import SVC
    from sklearn.model_selection import StratifiedKFold
    from sklearn.feature_selection import RFECV
    
        X = np.random.randint(0,363175645.191632,size=(5000, 37))
        Y = np.random.choice([0, 1], size=(37,))

我尝试通过以下方式选择功能:

    svc = SVC(kernel="linear")
    rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(2),
                  scoring='accuracy')
    
    rfecv.fit(X, Y)

代码挂起并进入无限循环,但是当我尝试使用另一种算法(例如 ExtraTreesClassifier)时,它工作得很好,这是怎么回事,请帮忙?

【问题讨论】:

    标签: python python-3.x machine-learning scikit-learn feature-selection


    【解决方案1】:

    当您执行 svm 时,因为它是基于距离的,所以缩放您的特征变量是有意义的,尤其是当它们很大时。您也可以查看this intro to svm。使用示例数据集:

    from sklearn.datasets import make_blobs
    import seaborn as sns
    import numpy as np
    from sklearn.preprocessing import StandardScaler
    
    Scaler =  StandardScaler()
    
    X, y = make_blobs(n_samples=5000, centers=3, shuffle=False,random_state=42)
    X = np.concatenate((X,np.random.randint(0,363175645.191632,size=(5000,35))),axis=1)
    y = (y==1).astype('int')
    
    X_scaled = Scaler.fit_transform(X)
    

    这个数据集的前两列只有 2 个有用的变量,从图中可以看出:

    plt.scatter(x=X_scaled[:,0],y=X_scaled[:,1],c=['k' if i else 'b' for i in y])
    

    现在我们在缩放数据上运行 rfe,我们可以看到它返回前两列作为顶部变量:

    from sklearn.svm import SVC
    from sklearn.model_selection import StratifiedKFold
    from sklearn.feature_selection import RFECV
    
    svc = SVC(kernel="linear")
    rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(2),scoring='accuracy')
    rfecv.fit(X_scaled, y)
    
    rfecv.ranking_
    
    array([ 1,  2, 17, 28, 33, 22, 23, 26,  6, 19, 20,  4, 10, 25,  3, 27, 11,
            8, 18,  5, 29, 14,  7, 21,  9, 13, 24, 30, 35, 31, 32, 34, 16, 36,
           37, 12, 15])
    

    【讨论】:

    • 那么我应该缩放数据吗?
    • 是的,你绝对应该这样做。也可以试试minmax
    猜你喜欢
    • 2013-12-30
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多