【问题标题】:How to use RandomizedSearchCV or GridSearchCV for only 30% of data如何仅对 30% 的数据使用 RandomizedSearchCV 或 GridSearchCV
【发布时间】:2020-07-05 00:25:25
【问题描述】:

如何仅对 30% 的数据使用 RandomizedSearchCV 或 GridSearchCV 以加快处理速度。 我的 X.shape 是 94456,100,我正在尝试使用 RandomizedSearchCV 或 GridSearchCV,但这需要很长时间。我正在运行我的代码几个小时,但仍然没有结果。 我的代码如下所示:

# Random Forest

param_grid = [
{'n_estimators': np.arange(2, 25), 'max_features': [2,5,10,25], 
 'max_depth': np.arange(10, 50), 'bootstrap': [True, False]}
]

clf = RandomForestClassifier()

grid_search_forest = GridSearchCV(clf, param_grid, cv=5, scoring='accuracy')
grid_search_forest.fit(X, y)

rf_best_model = grid_search_forest.best_estimator_


# Decsision Tree

param_grid = {'max_depth': np.arange(1, 50), 'min_samples_split': [20, 30, 40]}

grid_search_dec_tree = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=10, scoring='accuracy')
grid_search_dec_tree.fit(X, y)

dt_best_model = grid_search_dec_tree.best_estimator_


# K Nearest Neighbor

knn = KNeighborsClassifier()
k_range = list(range(1, 31))
param_grid = dict(n_neighbors=k_range)
grid_search_knn = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy')

grid_search_knn.fit(X, y)

knn_best_model = grid_search_knn.best_estimator_

【问题讨论】:

    标签: python machine-learning scikit-learn cross-validation


    【解决方案1】:

    您始终可以对部分数据进行抽样以适合您的模型。虽然不是为此目的而设计的,但train_test_split 在这里很有用(它可以处理洗牌、分层等,在手动抽样中,您必须自己处理这些):

    from sklearn.model_selection import train_test_split
    X_train, _, y_train, _ = train_test_split(X, y, stratify=y, test_size=0.70)
    

    通过请求 test_size=0.70,您的训练数据 X_train 现在将是您初始集 X 的 30%。

    您现在应该将代码中的所有 .fit(X, y) 语句替换为 .fit(X_train, y_train)。

    在更一般的层面上,您的网格中的所有这些np.arange() 语句看起来都有些矫枉过正 - 我建议在列表中选择一些具有代表性的值,而不是在那个详细信息中进行网格搜索。众所周知,随机森林对树的数量不敏感 n_estimators,并且一次添加一棵树几乎没有用 - 去像 'n_estimators': [50, 100] 这样的东西...

    【讨论】:

    • 感谢您的帮助。我有一个问题。如果我将代码更改为 'n_estimators': [50, 100] 它只需要 50 和 100 的值。我想检查 2 到 25 之间哪个是最好的。
    • @DinkoJantoš 你的电话。正如我试图在答案中暗示的那样,在 RF 中,对于非小型数据集,您不能期望 n_estimators=n 和 n_estimators=n+1 之间有任何重大变化;你总是可以做,比如说,[5, 10, 15, 20, 25]。
    【解决方案2】:

    ShuffleSplit 非常适合这个问题。您可以将cv 定义为:

    cv = ShuffleSplit(n_splits=1, test_size=.3)
    

    这意味着留出并使用 30% 的训练数据来验证每个超参数设置。另一方面,cv=5 会进行 5 次交叉验证,也就是说每个超参数设置都要经过 5 个fit 和predict。

    因此,这也需要对您的代码进行极少的更改。只需将GridSearchCV 中的cv=5 或cv=10 替换为cv = ShuffleSplit(n_splits=1, test_size=.3) 即可。

    【讨论】:

    • 这实际上会阻止代码执行 CV,这不是 OP 所要求的。
    猜你喜欢
    • 2018-06-18
    • 2019-09-10
    • 2019-11-28
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多