2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Решение задачи классификации
Сообщение02.05.2018, 13:35 


02/05/18
45
Добрый день!
Не так давно заинтересовался машинным обучением, есть несколько простых успешных примеров работы. Пытаюсь двигаться дальше.

В чем суть проблемы:
Есть ДатаСет детей заболевших ветрянкой, но в нём не содержится информации о здоровых ребятишках. Т.е. характеристики только заболевших. Как можно решить такую задачу?

Цель: определить болеет ли ребёнок ветрянкой (да/нет) или дать вероятность того что болеет.

В качестве инструментов используют пакет Анаконда.

Прошу направить или дать наводку, что читать, куда смотреть.

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение02.05.2018, 19:43 


12/07/15
3316
г. Чехов
В датасете отсутствует информация о частотности заболевания, поэтому про вероятность можно забыть. Классификации тоже невозможна, так как нет обучающей выборки. Столбец данных "Болеет ветрянкой?" можно выкинуть из датасета из-за неинформативности.
От того остаётся лишь заниматься неконтролируемым обучением (кластеризацией).

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение02.05.2018, 21:54 


02/05/18
45
Mihaylo в сообщении #1309537 писал(а):
В датасете отсутствует информация о частотности заболевания, поэтому про вероятность можно забыть. Классификации тоже невозможна, так как нет обучающей выборки. Столбец данных "Болеет ветрянкой?" можно выкинуть из датасета из-за неинформативности.
От того остаётся лишь заниматься неконтролируемым обучением (кластеризацией).

Спасибо за наводку, буду копать в этом направлении.
P.S. А если например собрать информацию про ОРВИ и показать частотность (1 ребенок болеет 2-3-4 раза в год), как на основании этих данных строить вероятностную модель? можно ссылку на статью или просто название методики

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение03.05.2018, 02:03 


01/05/17
50
Где я?
Вашу задачу можно рассматривать как обнаружение outliers: скорее всего, "здоровые" будут outliers по сравнению с больными. "Здоровые" в кавычках потому, что больные чем нибудь другим также могут быть классифицированы как outliers, при условии, что симптомы сильно отличаются. Для таких задач можно попробовать One Class SVM:

http://scikit-learn.org/stable/modules/ ... ssSVM.html

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение04.05.2018, 09:24 


02/05/18
45
Paragraph в сообщении #1309638 писал(а):
Вашу задачу можно рассматривать как обнаружение outliers: скорее всего, "здоровые" будут outliers по сравнению с больными. "Здоровые" в кавычках потому, что больные чем нибудь другим также могут быть классифицированы как outliers, при условии, что симптомы сильно отличаются. Для таких задач можно попробовать One Class SVM:

http://scikit-learn.org/stable/modules/ ... ssSVM.html

Спасибо, буду пробовать!

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение06.05.2018, 20:03 


02/05/18
45
Paragraph в сообщении #1309638 писал(а):
Вашу задачу можно рассматривать как обнаружение outliers: скорее всего, "здоровые" будут outliers по сравнению с больными. "Здоровые" в кавычках потому, что больные чем нибудь другим также могут быть классифицированы как outliers, при условии, что симптомы сильно отличаются. Для таких задач можно попробовать One Class SVM:

http://scikit-learn.org/stable/modules/ ... ssSVM.html


Добрый день!
Успешно строю модель и ловлю аномалии, см. скрин http://prntscr.com/jegmxs

Проблема теперь на этапе контрольного примера. Основной вопрос связан со шкалированием.
Контрольный элемент, необходимо шкалировать в общей выборке или можно как-то отдельно рассчитать "точки"?

Листинг:

Код:
data_params1 = np.array(data.values[:,:5], dtype="float64")
data_params = scale(data_params1)
X = PCA(n_components=2).fit_transform(data_params)
data_num = X.shape[0]
OUTLIER_FRACTION = 0.01

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение08.05.2018, 03:14 


01/05/17
50
Где я?
Возникло несоколько вопросов.

Что имеется ввиду под общей выборкой - training data set?
Если так, то да - приводите к тем же масштабам.

Не совсем понятно почему в PCA заказаны только две компоненты - экспериментально подобрано?

Не вижу one class SVM в листинге. Нельзя ли полностью код запостить?

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение08.05.2018, 15:44 


02/05/18
45
Paragraph в сообщении #1310887 писал(а):
Возникло несоколько вопросов.

Что имеется ввиду под общей выборкой - training data set?
Если так, то да - приводите к тем же масштабам.

Не совсем понятно почему в PCA заказаны только две компоненты - экспериментально подобрано?

Не вижу one class SVM в листинге. Нельзя ли полностью код запостить?


Добрый день!
Да, под общей выборкой я имел ввиду обучающий набор.
По поводу РСА, мне казалось двух будет достаточно, попробую заказать больше компонент.

Вот полный листинг (обучение):

Код:
import pandas
import os as os
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib.font_manager
from scipy import stats
from sklearn.preprocessing import scale
from sklearn import svm
from sklearn.decomposition import PCA
import mglearn
from IPython.display import display
plt.rc('font', family='Verdana')
data = pandas.read_csv('D:\\0.Machine_Learning\\2.Datasets\\pcz_nt.csv', delimiter=';', header=0, encoding='utf-8')
data_params1 = np.array(data.values[:,:5], dtype="float64")
data_params = scale(data_params1)
X = PCA(n_components=2).fit_transform(data_params)
data_num = X.shape[0]
OUTLIER_FRACTION = 0.01
clf = svm.OneClassSVM(kernel="rbf")
clf.fit(X)

dist_to_border = clf.decision_function(X).ravel()
threshold = stats.scoreatpercentile(dist_to_border,
            100 * OUTLIER_FRACTION)
is_inlier = dist_to_border > threshold




Проверка:

Код:
test = pandas.read_csv('D:\\0.Machine_Learning\\2.Datasets\\pcz_nt_t.csv', delimiter=';', header=0, encoding='utf-8')
test1 = np.array(test.values[:,:5], dtype="float64")
All = np.vstack((test1, data_params1))
test2 = scale(All)
Z = PCA(n_components=2).fit_transform(test2)
prediction = clf.predict(np.atleast_2d(Z[0]))
prediction

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение09.05.2018, 02:29 


01/05/17
50
Где я?
У Вас для теста и для обучения применяется разное масштабирование.
Код:
All = np.vstack((test1, data_params1))
не то же самое, что
Код:
data_param1
, соответственно и мастштаб будет другой. Более правильно - надо явно вычислить преобразоваие обучаещего набора в нормализованый, а потом точно такое же применить к тестовым данным.

Насчет PCA. Число измерений - метапараметр Вашего алгоритма. Его можно оптимизировать. Но, как я понимаю, размерность данных относительно мала, поэтому и вопрос - нужен ли PCA вообще?

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение09.05.2018, 04:54 


01/05/17
50
Где я?
Кстати, если уж PCA оставлять, то надо сохранить преобразование полученное из обучающй выборки и потом применять его к тестовым данным. Подгоняя его заново, мы получим нечто другое, вовсе не то, что использовалось в обучении.

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение09.05.2018, 10:01 


02/05/18
45
Цитата:
Кстати, если уж PCA оставлять, то надо сохранить преобразование полученное из обучающей выборки и потом применять его к тестовым данным. Подгоняя его заново, мы получим нечто другое, вовсе не то, что использовалось в обучении.


Я догадывался, что необходимо так сделать, но пока не разобрался как, и решил пренебречь в расчете на незначительное отклонение.

Цитата:
Но, как я понимаю, размерность данных относительно мала, поэтому и вопрос - нужен ли PCA вообще?


Признаюсь, мне пока не хватает опыта, чтобы ответить на этот вопрос. Буду пробовать.
Спасибо за помощь!

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение09.05.2018, 21:40 


01/05/17
50
Где я?
Тогда вот еще одно соображение в пользу того, что PCA тут вставлен не так как надо. Рассмотрим облако 2D точек в заполняющее сильно сплюснутый эллипс вдоль диагонали единичного квадарата отцентированного около 0. Если сначала запустить scale, то ничего не изменится. Маргинальные распределения и так уже отцентрированы и близки к нормализованным. Зато PCA сразу продемонстрирует сплюснутость. Применим scale после PCA - получится нечто похожее на шар в главных осях. Теперь вопрос - что здесь сигнал, а что шум? Если вторая главная ось - шум, то зачем его масштабировать?

Посольку в ходе обсуждения стали понятны некоторые новые детали, почему бы не попробовать нечто совсем простое как начальное приближение: приводим данные к главным осям, все компоненты оставляем. Аппроксимириуем облако точек нормальным распределением (фактически тот же One Class SVM вместе с RBF, но с единственной базовой одной точкой - центром кластера). Проверка на outlier тривиальна - приводим новую точку к главным осям и проверяем likelihood, того что точка принадлежит нашему супер простому распределению. Что то мне подсказывает, если у вас "игрушечные" данные, то этого уже хватит для хорошего классификатора.

И вообще, начинать надо с визуализации всего, что только можно визуализировать. Тогда 90% вопросов отпадет уже на это этапе.

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение09.05.2018, 23:02 


02/05/18
45
Цитата:
Если вторая главная ось - шум, то зачем его масштабировать?

Понял, шум масштабировать смысла нет.
Разобрался сегодня как сохранять преобразование обучающего набора и применять его к тестовому. Так же отказался от РСА, что совсем не повлияло на точность модели. Сейчас она ~50% (если я всё сделал правильно).
Листинг:

Код:
import pandas
import os as os
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import pylab
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.font_manager
from scipy import stats
from sklearn.preprocessing import scale
from sklearn import preprocessing
from sklearn import svm
from sklearn.decomposition import PCA
import mglearn
from IPython.display import display
plt.rc('font', family='Verdana')

train_data = pandas.read_csv('D:\\0.Machine_Learning\\2.Datasets\\pcz_nt.csv', delimiter=';', header=0, encoding='utf-8')
test_data = pandas.read_csv('D:\\0.Machine_Learning\\2.Datasets\\pcz_nt_t.csv', delimiter=';', header=0, encoding='utf-8')
train_params1 = np.array(train_data.values[:,:5], dtype="float64")
test_params1 = np.array(test_data.values[:,:5], dtype="float64")

scaler = preprocessing.StandardScaler().fit(train_params1)
train_params = scaler.transform(train_params1)
test_params = scaler.transform(test_params1)

X = train_params
data_num = train_params.shape[0]
OUTLIER_FRACTION = 0.01
clf = svm.OneClassSVM(kernel="rbf")
clf.fit(X)
dist_to_border = clf.decision_function(X).ravel()
threshold = stats.scoreatpercentile(dist_to_border,
            100 * OUTLIER_FRACTION)
is_inlier = dist_to_border > threshold

prediction = clf.predict(np.atleast_2d(train_params))
result = prediction


Цитата:
Посольку в ходе обсуждения стали понятны некоторые новые детали, почему бы не попробовать нечто совсем простое как начальное приближение: приводим данные к главным осям, все компоненты оставляем. Аппроксимириуем облако точек нормальным распределением (фактически тот же One Class SVM вместе с RBF, но с единственной базовой одной точкой - центром кластера). Проверка на outlier тривиальна - приводим новую точку к главным осям и проверяем likelihood, того что точка принадлежит нашему супер простому распределению. Что то мне подсказывает, если у вас "игрушечные" данные, то этого уже хватит для хорошего классификатора.

Понял, попробую с этим поработать.

Цитата:
И вообще, начинать надо с визуализации всего, что только можно визуализировать. Тогда 90% вопросов отпадет уже на это этапе.

А какие лучше использовать новичку инструменты? Я сейчас пытаюсь освоить glueviz, не знаю оптимальный ли это вариант для начального визуального анализа..

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение11.05.2018, 02:11 


01/05/17
50
Где я?
1. Я не утверждал, что вторая компонента - шум :) Данных я не видел, решать Вам. То, что точность от применения или удаления PCA не меняется, вполне может указывать на избыточность данных - там, вероятно, есть зависимые столбцы. Либо, учитывая изначально невысокую точность модели, может оказаться, что модели все равно, что поедать. Настоятельно рекомендую визуализацию и попытку простого подбора нормального распределения для аппроксимации облака точек. Как первый шаг и как benchmark для последующих улучшений.
2. Тточность 50% получается случайным бросанием монетки. Надо улучшать.
3. Для визуализации все есть в matplotlib, масса примеров, включен в Анакоду. Есть еще Bokeh - гуглится. Это более интерактивная библиотека. Выбор зависит от потребностей. Генерить отчет или графики в статью удобнее с matplotlib. Последний раз, когда я смотрел на Bokeh, там не было спасения в pdf или postscript.

Методологически грузить в один скрипт обучающую и тестовую выборки нежелательно. С ростом сложности скрипта легко просмотреть момент, когда тестовые данные примут участие в построении модели вопреки устремлений разработчика.

Если данные не приватные - нельзя ли их посмотреть?

 Профиль  
                  
 
 Re: Решение задачи классификации
Сообщение11.05.2018, 10:03 


02/05/18
45
Код:
Если данные не приватные - нельзя ли их посмотреть?


Да, конечно смотрите, вот ссылка: http://dropmefiles.com/4XqGX
Только это не dataset, который был в постановке, я решил взять данные попроще, чтобы отработать методику. На них успешно решаю задачу классификации пола человека, методом случайного леса, точность ~96%.
Сейчас в SVM, на обучение отправляю пол = 1 (мужчины), а для тестирования смешанный набор М, Ж. Точность как известна пока хромает :)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group