• Почему вылетает Telegram?

    @Kind_Man Автор вопроса
    Teleweb developer, каких клиентов?
  • Как повысить точность модели машинного обучения?

    @Kind_Man Автор вопроса
    Максим Припадчев, уже начал играться с различными настройками. А подскажите, почему происходит следующая ситуация: у меня есть несколько колонок (в одних - огромные значения, в других - меньше 1, но больше 0), которые я сначала логарифмирую, а потом применяю к ним StandardScaler в препроцессоре. И вот, если в список названия колонок для этого препроцессора, эти "log" колонки включить дважды, то я получаю точность 0,7, а если один раз - 0,65.

    Если логарифмирования этих колонок не делать, точность также будет у 0,6.

    Однако, в свою очередь логарифмирование этих колонок вызывает проблемы далее, потому что большинство FeatureSelection алгоритмов (как SelectKBest) отказываются работать с отрицательными значениями, к которым приводит логарифмирование чисел меньше 1, но больше 0. Я подумал решить это, просто прибавив к ним единицу и тем самым избежать отрицательных значений, но после этого точность просела на 2 процента. Зато теперь можно сделать Features Selection.

    Поэтому вопрос. Как следует шаг за шагом настраивать модель? Опираться на лучшую получившуюся и с нее двигаться на следующий шаг?
  • Как повысить точность модели машинного обучения?

    @Kind_Man Автор вопроса
    Максим Припадчев, огромное спасибо! Решил поменять эстиматор со Случайного Леса, т.к. он выдавал точность 1 на тренировочном сете. Заменил KNN и уже похоже на реальность:
    model score for training set: 0.757
    model score for testing set: 0.700

    for column in log10_cols:
        X[column] = np.log10(X[column])
    for column in log_cols:
        X[column] = np.log(X[column])
    
    numeric_transformer = Pipeline(
        steps=[("scaler", StandardScaler()),]
    )
    
    categorical_transformer = Pipeline(
        steps=[
            ("encoder", OneHotEncoder(handle_unknown="ignore")),
        ]
    )
    
    
    preprocessor = ColumnTransformer(
        transformers=[
            ("num", numeric_transformer, numeric_features),
            ("cat", categorical_transformer, categorical_features),
        ]
    )
    
    
    clf = Pipeline(
        steps=[ ("preprocessor", preprocessor),
            ("classifier", KNeighborsClassifier())
        ]
    )
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    clf.fit(X_train, y_train)
    print("model score for training set: %.3f" % clf.score(X_train, y_train))
    print("model score for testing set: %.3f" % clf.score(X_test, y_test))


    Изначальные данные уже не знаю, как изменить, потому что, видимо, дальше и некуда. MinMaxScaler сводит точность до 0,52, если не делать предварительного логарифмирования нескольких колонок - тоже 0,52, с ними максимальные результаты, а дальше ничего уже никак не меняется.

    Как понимаю, сейчас надо заняться Features Selection
  • Как повысить точность модели машинного обучения?

    @Kind_Man Автор вопроса
    Максим Припадчев, 5000-100 - 1 или 0, да. Network 3 вида: имеют коды 777, 888, 999.
  • Как повысить точность модели машинного обучения?

    @Kind_Man Автор вопроса
    Категориальные имеют следующие названия:

    categorical_cols = ['Type', 'Network',
                        '5000','4500','4000','3500','3000','2500','2000','1500',
                        '1000','900','800','700','600','500','400','300','200','100' ]

    и по сути: Type и Network - просто, собственно виды типа и сети, никакой тип или сеть не имеет большего или меньшего веса среди себе подобных. От 5000 до 100 каждая колонка имеет значение 0 или 1: удается на эту сумму сделать покупку или нет.

    Я всё сделал одним
    for column in categorical_cols:
        X_train[column] = pd.Categorical(X_train[column])
        X_train = pd.get_dummies(X_train, columns=[column])

    но сейчас, писав этот комментарий вам, подумал, что я не прав. Этот код подходит Type и Network - так как они просто виды - nominal, а вот с 5000-100 надо по-другому, ведь тут уже не столько виды, сколько результат, вес какой-то. Это же ordinal.

    По поводу StandardScaler и всех численных в один эстиматор.

    попробовал так
    all_numeric = log_cols+log10_cols+numerical_cols
    X_train[all_numeric]=standard_scaler.fit_transform(X_train[all_numeric])
    X_test[all_numeric]=standard_scaler.fit_transform(X_test[all_numeric])

    и Accuracy упала до 0,52
  • Как повысить точность модели машинного обучения?

    @Kind_Man Автор вопроса
    Максим Припадчев, хорошо, буду благодарен, если подскажете. И так.

    1) Сперва создаю все сеты
    X = df.drop(columns=['Status'])
    y = df['Status']
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    minMax_scaler = MinMaxScaler()
    standard_scaler = StandardScaler()


    2) Далее сохраняю названия колонок в соответствующие нормализациям действия и для каждой выполняю эти действия:
    categorical_cols = ['',...]
    log10_cols = ['',...]
    log_cols = ['',...]
    numerical_cols = ['',...]
    for column in categorical_cols:
        X_train[column] = pd.Categorical(X_train[column])
        X_train = pd.get_dummies(X_train, columns=[column])
    for column in log10_cols:
        X_train[column] = np.log10(X_train[column])
    for column in log_cols:
        X_train[column] = np.log(X_train[column])
    X_train[numerical_cols]=minMax_scaler.fit_transform(X_train[numerical_cols])

    3) Делаю то же самое с тестовым сетом.
    for column in categorical_cols:
        X_test[column] = pd.Categorical(X_test[column])
        X_test = pd.get_dummies(X_test, columns=[column])
    for column in log10_cols:
        X_test[column] = np.log10(X_test[column])
    for column in log_cols:
        X_test[column] = np.log(X_test[column])
    X_test[numerical_cols]=minMax_scaler.transform(X_test[numerical_cols])

    4) Обучение и результаты:
    rf_model = RandomForestClassifier(random_state=42)
    rf_model.fit(X_train, y_train)
    rf_train_preds = rf_model.predict(X_train)
    rf_train_acc = accuracy_score(y_train, rf_train_preds)
    rf_test_preds = rf_model.predict(X_test)
    rf_test_acc = accuracy_score(y_test, rf_test_preds)
    
    print(f'Random Forest training accuracy: {rf_train_acc:.4f}')
    print(f'Random Forest test accuracy: {rf_test_acc:.4f}')

    Получается:
    Random Forest training accuracy: 1.0000
    Random Forest test accuracy: 0.6735
  • Как повысить точность модели машинного обучения?

    @Kind_Man Автор вопроса
    Максим Припадчев, хоть и хочется, но об этом я вас не попрошу) И так, большое вам спасибо за ваши советы, они работают.

    В общем, дело такое, на примере алгоритма случайного леса:
    - когда я запускаю его на вообще необработанных данных, просто сырых, взятых из log файла, я получаю точность 0,65.
    - после своей обработки (категориальные, min-max для колонок с числами от 0 до 100, log для колонок с очень маленькими значениями, log10 для колонок с очень большими значениями) я получаю наибольшую точность 0,67
    - если просто все численные колонки скидываю в одну кучу и обрабатываю их minMax, то получаю 0,53, standardScalerом получаю 0,52.

    Главный вопрос у меня: почему настолько слабо отличаются точности сырого набора данных и полностью обработанного? В чем причина и как это изменить? Куда копать дальше?
  • Как повысить точность модели машинного обучения?

    @Kind_Man Автор вопроса
    Максим Припадчев, почитал документацию scikit'ов, и вот что понял и как стал делать.

    1) По численным значениям: крайне маленькие и крайне большие значения логарифмировал, остальные minMaxScaler-ом свел к диапазону 0-1. Но теперь так получилось, что логарифмированные значения приняли либо отрицательные значения, либо около 10. В это же время остальные численные значения лежат в диапазоне 0-1. Значит ли это, что теперь на всех них разом стоит применить Standard Scaler, чтобы свести их все одному и тому же диапазону?

    2) Как понял из документации и ваших ответов, сначала надо разделить данные на тренировочные и тестовые, и затем к обоим применить одинаковые "трансформации" (только на тренировочном fit_transform, а на тестовом просто transform). Но вот тут вопрос: Min-Max вызывается как minMax_scaler.fit_transform, и если я дальше буду ещё раз трансформировать данные (чтобы сопоставить их с логарифмированными), нормально ли снова применять fit_transform только от StandardScaler?
  • Как повысить точность модели машинного обучения?

    @Kind_Man Автор вопроса
    Максим Припадчев, большое спасибо, очень многое прояснили, изучаю и делаю по вашим советам и ссылкам. С категориальными данными разобрался, а вот насчёт численных - вопрос. Численные данные в датасете в каждой колонке "свои": где-то это значения от 1000 до 300000+, где-то настолько крошечные, что записаны как 0,..е-6. Очевидно же, что для каждой численной колонки нужны свои инструменты? Для каких-то данных логарифмирование, для каких-то min-max и тд. И это же нормально, так? Это их всех и сводит в единый вид для алгоритма машинного обучения? Численные значения в итоге после препроцессинга обязаны оказаться все примерно в одном диапазоне числовом или нет?
  • Как повысить точность модели машинного обучения?

    @Kind_Man Автор вопроса
    Спасибо вам за такой подробный и хороший ответ, многое прояснили, буду пробовать. Уточнил: действительно, некоторые данные категориальные, а я с ними никак отдельно не работал. Подскажите вот что: получается, проверять данные после препроцессинга, качество препроцессинга, нужно на дефолтном алгоритме, с его дефолтными настройками. Как понять, что препроцессинг был сделан правильно, оценить его?
  • Какой алгоритм лучше подходит для определения прибыльной сделки на бирже?

    @Kind_Man Автор вопроса
    Максим Припадчев, что вы имеете под приведением данных к нормальному виду? У меня есть множество разных показателей, все они числа. Как и к какому виду они приводятся?
  • Какой алгоритм лучше подходит для определения прибыльной сделки на бирже?

    @Kind_Man Автор вопроса
    Максим Припадчев, хочу попросить совета, т.к. новичок в теме, и не до конца понимаю, что происходит.

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    list = [n for n in range(1, 30)]
    list2 = [n for n in range(1, 30)]
    grid_params = { 'n_neighbors' : list2,
                   'weights' : ['uniform','distance'],
                   'metric' : ['minkowski','euclidean','manhattan'],
                    'algorithm':['auto', 'ball_tree', 'kd_tree', 'brute'],
                    'leaf_size':list}
    
    gs = GridSearchCV(KNeighborsClassifier(), grid_params, verbose = 1, cv=3, n_jobs = -1)
    g_res = gs.fit(X_train, y_train)
    print(g_res.best_score_, g_res.best_params_)
    knn = KNeighborsClassifier(**gs.best_params_)
    knn.fit(X_train, y_train)
    y_hat = knn.predict(X_train)
    y_knn = knn.predict(X_test)
    print('Training set accuracy: ', metrics.accuracy_score(y_train, y_hat))
    print('Test set accuracy: ',metrics.accuracy_score(y_test, y_knn))
    scores = cross_val_score(knn, X, y, cv =5)
    print('Model accuracy: ',np.mean(scores))


    Использую KNN и тюню её поиском по сетке. Результаты получаются такими:

    Training set accuracy: 1.0
    Test set accuracy: 0.72
    Model accuracy: 0.512

    Что напрягает: почему на трейнинге 1? Оверфиттинг? Однако, как я понял, главное тут - это тест сет точность, и она хорошая. Проблема случилась, когда я в свой датасет добавил ещё одну запись. После этого цифры точности упали до 0,5 везде.

    Где здесь может быть что-то не так?
  • Какой алгоритм лучше подходит для определения прибыльной сделки на бирже?

    @Kind_Man Автор вопроса
    Я имею в виду использовать RandomForest, KNeighborsClassifier, DecisionTreeClassifier и SVC отдельно, оттюнив каждую, а потом совместив их все через VotingClassifier
  • Какой алгоритм лучше подходит для определения прибыльной сделки на бирже?

    @Kind_Man Автор вопроса
    Спасибо за развернутый ответ. А как вы считаете, есть ли смысл применить несколько алгоритмов, а потом объединить их ответы через Голосование?
  • Ноутбук не видит жесткий диск после замены, что делать?

    @Kind_Man Автор вопроса
    rPman, в общем, не знаю, что было вчера, но сегодня, просто заново подключив диски, ноутбук заметил и ССД, и ХДД (его я вместо дисковода добавил). Но теперь новая проблема: при установке Винды на ССД, на определенном моменте установка замирает на таком-то проценте, после чего ноут перезагружается и все по-новой (при этом на сам ССД пара гб Винды устанавливается). Из-за этого каждый раз при новой попытке ССД форматирую, и теперь стала появляться ошибка, что Винда не видит этот диск (хотя он есть в списке) и просит переподключить его
  • Ноутбук не видит жесткий диск после замены, что делать?

    @Kind_Man Автор вопроса
    Хорошая мысль. Но проблема в том, что ССД и в Биосе не видно