Главная » Хабрахабр » [Из песочницы] Multi-output в машинном обучении

[Из песочницы] Multi-output в машинном обучении

Задача алгоритмов искусственного интеллекта обучиться, основываясь на предоставленной выборке, для последующего предсказания данных. Однако, наиболее распространенная задача о которой говорят в большинстве учебниках — это предсказание одного значения, того или иного множества признаков. Что если нам нужно получить обратные данные? То есть, получить определенное количество признаков, основываясь на одном или больше значении.
Столкнувшись с задачей подобного рода и не имея углубленных знаний в разделах математической статистики и теории вероятностей — для меня это оказалось небольшим исследованием.

Соответственно я поработала с классом предоставленным scikit-learn — Imputer. Итак, первое с чем я ознакомилась это метод восстановления упущенных данных средними значениями. Ссылаясь на материалы, могу уточнить:

Класс Imputer предоставляет основные стратегии восстановления утерянных значений, либо с использованием среднего, медианы или наиболее часто встречающегося значения столбца или строки в которых находятся утерянные данные.

Даже несмотря на понимание того, что результат не будет полезен, я все равно решила попробовать воспользоваться этим классом, и вот что собственно вышло:

import pandas as pd from sklearn.preprocessing import Imputer
from sklearn.model_selection import train_test_split url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'
df = pd.read_csv(url, header=None) df.columns = ['Класс', 'Алкоголь', 'Яблочная кислота', 'Зола', 'Щелочность золы', 'Магний', 'Всего фенола', 'Флавоноиды', 'Фенолы нефлаваноидные', 'Проантоцианидины', 'Интенсивность цвета', 'Оттенок', 'OD280/OD315 разбавленных вин', 'Пролин'] imp = Imputer(missing_values='NaN', strategy='mean')
imp.fit(df)
imp.transform([[3, 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN']])

array([[3.00000000e+00, 1.30006180e+01, 2.33634831e+00, 2.36651685e+00, 1.94949438e+01, 9.97415730e+01, 2.29511236e+00, 2.02926966e+00, 3.61853933e-01, 1.59089888e+00, 5.05808988e+00, 9.57449438e-01, 2.61168539e+00, 7.46893258e+02]])

После попытки проверить полученные данные на классе RandomForestClassifier, выяснилось что он с нами не согласен, и вообще считает что этот массив значений точно соответствует первому классу, но никак не третьему.

MultiOutputRegressor создан специально для тех регрессоров, которые не поддерживают multi-target регрессию. Теперь, после того, как мы поняли что сей метод нам не подходит, обратимся к классу MultiOutputRegressor. Проверим его действие на методе наименьших квадратов:

from sklearn.datasets import make_regression
from sklearn.multioutput import MultiOutputRegressor X, y = make_regression(n_features=1, n_targets=10)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4)
multioutput = MultiOutputRegressor(LinearRegression()).fit(X, y) print("Правильность на тестовом наборе: ".format(multioutput.score(X_test, y_test)))
print("Правильность на обучающем наборе: {:.2f}".format(multioutput.score(X_train, y_train)))

Правильность на тестовом наборе: 0.82
Правильность на обучающем наборе: 0.83

Результат вполне неплох. Теперь проверим работу класса RandomForestRegressor, который также поддерживает multi-target регрессию, на реальных данных.

df = df.drop(['Класс'], axis=1)
X, y = df[['Алкоголь', 'Проантоцианидины']], df.drop(['Алкоголь', 'Проантоцианидины'], axis=1)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1) forest = RandomForestRegressor(n_estimators=30, random_state=13)
forest.fit(X_train, y_train)
print("Правильность на тестовом наборе: {:.2f}".format(forest.score(X_test, y_test)))
print("Правильность на тренировочном наборе:{:.2f}".format(forest.score(X_train, y_train)))

Правильность на тестовом наборе: 0.65
Правильность на тренировочном наборе:0.87

Дабы не вводить некоторых людей в заблуждение относительно проантоцианидинов

собственно

Проантоцианидины — природное химическое соединение. Находится в основном в косточках и кожице винограда, также оно содержится в дубе и попадает в вино при выдержке его в дубовых бочках. Молекулярная масса проантоцианидинов меняется в зависимости от продолжительности выдержки вин. Чем старее вино — тем их больше (для очень старых вин молекулярная масса уменьшается).

В значительной степени влияют на стойкость красных вин.

Результат хуже, чем на синтетических данных (на них случайный лес отрабатывает на 99%). Однако, с добавлением признаков он как и предполагалось улучшается.

С помощью multi-output методов можно решить множество интересных задач и получить действительно нужные данные.


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Теория счастья. Случайности неслучайны

Продолжаю знакомить читателей Хабра с главами из своей книжки «Теория счастья» с подзаголовком «Математические основы законов подлости». Это ещё не изданная научно-популярная книжка, очень неформально рассказывающая о том, как математика позволяет с новой степенью осознанности взглянуть на мир и жизнь ...

Снежинки в стилистике StarWars своими руками (upd. 2018)

Для изготовления снежинок вам потребуется: Файл со схемой.2. 1. Ножницы.4. Принтер (думаю лазерный будет предпочтительней).3. Бумага.5. Скальпель.5. Лично мое мнение — при печати на стандартной офисной бумаге плотностью 80г/м2 становится не очень удобно вырезать (все-таки при складывании бумаги получается толстый ...