Как настроить ML-модель?

Всем привет. Я новичок в машинном обучении, и передо мной стоит задача настроить модель Рандомного Леса. Я решил, что лучшим (так ли это?) способом поиска лучших настроек для модели будет перебор всех возможных настроек модели, и затем выбор из них лучших. Для этого я загнал все в циклы и дал машинному обучению возможность посмотреть все варианты.

Проблема в том, что от такой нагрузки не выдержала память ПК (осталось 11гб и они за 3 часа кончились). Теперь либо надо освобождать для этой задачи больше памяти, либо, зачем я пришел к вам: 1) пересмотреть свой алгоритм? 2) попросить вас подсказать бесплатный сайт с компилятором Питона, куда я могу закинуть свой логфайл, из которого строится датафрейм, и на котором все вычисления и будут проведены.

Так же оставлю свой код:

random_states=[0,42,1000]
min_samples_leafs = np.linspace(0.1, 0.5, 5, endpoint=True)
min_samples_splits = np.linspace(0.1, 1.0, 10, endpoint=True)
n_estimators = [1, 2, 4, 8, 16, 32, 64, 100, 200]
max_depths = np.linspace(1, 32, 32, endpoint=True)
train_results = []
test_results = []
temp_results = []
attempts = [1,2,3,4,5,6,7,8,9,10]
for estimator in n_estimators:
    for max_depth in max_depths:
        for min_samples_split in min_samples_splits:
            for min_samples_leaf in min_samples_leafs:
                for random_state in random_states:
                    for attempt in attempts:
                       X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2,random_state=random_state)
                       rf = RandomForestClassifier(n_estimators=estimator, max_depth=int(max_depth),n_jobs=-1, min_samples_split=min_samples_split, min_samples_leaf=min_samples_leaf)
                       rf.fit(X_train, y_train)
                       train_pred = rf.predict(X_train)
                       false_positive_rate, true_positive_rate, thresholds = roc_curve(y_train, train_pred)
                       roc_auc = auc(false_positive_rate, true_positive_rate)
                       temp_results.append({"estimator":estimator, "max_depth":max_depth, "sample_split":min_samples_split,"sample_leaf":min_samples_leaf,"random_state":random_state,"attempt":attempt,"result":roc_auc})
                       if attempt==attempts[-1]:
                           results = 0
                           for elem in temp_results:
                               results+=float(elem["result"])
                           results=results/10
                           test_results.append({"estimator":estimator, "max_depth":max_depth, "sample_split":min_samples_split,"sample_leaf":min_samples_leaf,"random_state":random_state,"attempt":attempt,"final_result":results})




result= []
max = 0
goat = 0
for dict in test_results:
    if dict["final_result"]>max:
        max = dict["final_result"]
        goat = dict
        result.append(dict)
print(datetime.now().strftime("%H:%M:%S"), "END ML")
print(result)
print(goat)
  • Вопрос задан
  • 249 просмотров
Решения вопроса 2
Maksim_64
@Maksim_64
Data Analyst
То что вы пытаетесь сделать это называется тюнинг гиперпараметров. Так не делается конечно. в sklearn есть решения из коробки. При чем это целый этап в машинном обучении по этому целый раздел документации этому посвящен. https://scikit-learn.org/stable/modules/grid_searc...
Там не только представлены классы но и различные методики которые используются. Изучайте там примеры есть, так что решите свой вопрос.
Ответ написан
Комментировать
@sunsexsurf
IT & creative
автор выше вам ответил очень объемно и правильно. Дополнительно, не забывайте про такую библиотеку (hyperopt): https://habr.com/en/post/542624/
Она работает лучше, чем встроенная в sklearn (но для базового понимания надо начать с нее)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы