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
3363
г. Чехов
В датасете отсутствует информация о частотности заболевания, поэтому про вероятность можно забыть. Классификации тоже невозможна, так как нет обучающей выборки. Столбец данных "Болеет ветрянкой?" можно выкинуть из датасета из-за неинформативности.
От того остаётся лишь заниматься неконтролируемым обучением (кластеризацией).

 Профиль  
                  
 
 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, Супермодераторы



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

Сейчас этот форум просматривают: MoonWatcher


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

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