Практическое руководство по анализу данных c Jupyter

Работа в консоли

Для выполнения консольных команд в jupyter перед началом ввода требуется указать восклицательный знак (!):
>>!wget
wget: missing URL
Usage: wget [OPTION]... [URL]...

Try `wget --help' for more options.
>>!ls

README.md
>>!tar xvf

tar: Option f requires an argument
Usage:
  List:    tar -tf 
  Extract: tar -xf 
  Create:  tar -cf  [filenames...]
  Help:    tar --help

Получение и работа с данными

import pandas
tables = pandas.read_html(
    'https://en.wikipedia.org/wiki/Dow_Jones_Industrial_Average', 
    attrs={'class': 'wikitable'},  # фильтруем только таблицы с данными
    header=0, # делаем первую строчку — заголовком
)

Машинное обучение

Пусть дана выборка Census Income Data Set. Решаем следующую задачу - по социальным признакам человека необходимо определить зарабатывает ли он более 50к или менее.

Пред-обработка данных, извлечение признаков

Загрузим выборку из репозитория:

>>!wget https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data


--2016-04-08 13:11:51--  https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
Resolving archive.ics.uci.edu... 128.195.10.249
Connecting to archive.ics.uci.edu|128.195.10.249|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3974305 (3.8M) [text/plain]
Saving to: 'adult.data'

adult.data          100%[=====================>]   3.79M  1.49MB/s   in 2.5s   

2016-04-08 13:11:54 (1.49 MB/s) - 'adult.data' saved [3974305/3974305]

Загружаем файл и делаем из него pandas.DataFrame:

data = pandas.read_csv('adult.data', header=None)
print data.shape
data.head()
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
0 39State-gov77516Bachelors13Never-marriedAdm-clericalNot-in-familyWhiteMale2174040United-States<=50K
1 50Self-emp-not-inc83311Bachelors13Married-civ-spouseExec-managerialHusbandWhiteMale0013United-States<=50K
2 38Private215646HS-grad9DivorcedHandlers-cleanersNot-in-familyWhiteMale0040United-States<=50K
3 53Private23472111th7Married-civ-spouseHandlers-cleanersHusbandBlackMale0040United-States<=50K
4 28Private338409Bachelors13Married-civ-spouseProf-specialtyWifeBlackFemale0040Cuba<=50K

Выберем непрерывные (числовые) признаки и дискретные (категориальные) признаки.

continious_features = [0,2,4,10,11,12]
discreete_features = [1,3,5,6,7,8,9,13]
target = [14]

Создадим матрицу, где строчкой будет объект, а столбцом признак. Сначала составим матрицу из непрерывных признаков.

X = data.iloc[:,continious_features].values
print X.shape
X

(32561, 6) array([[ 39, 77516, 13, 2174, 0, 40], [ 50, 83311, 13, 0, 0, 13], [ 38, 215646, 9, 0, 0, 40], ..., [ 58, 151910, 9, 0, 0, 40], [ 22, 201490, 9, 0, 0, 20], [ 52, 287927, 9, 15024, 0, 40]])

Бинаризуем категориальные и целевую переменную:

from sklearn.preprocessing import LabelBinarizer
import numpy
lb = LabelBinarizer()
for f in discreete_features:
    X = numpy.hstack([X,lb.fit_transform(data.iloc[:,f])])
Y = lb.fit_transform(data.iloc[:,target])
print Y.shape
Y

(32561, 1) array([[0], [0], [0], ..., [0], [0], [1]])

Наконец разбиваем выборку на обучающую часть и тестовую

ids = numpy.arange(X.shape[0])
numpy.random.shuffle(ids)

train_len = int(len(ids) * 0.8)

X_train = X[ids[:train_len],:]
Y_train = Y[ids[:train_len],:]
X_test = X[ids[train_len:],:]
Y_test = Y[ids[train_len:],:]

Построим гистограммы признаков

%pylab inline
import matplotlib.pyplot as plt
figsize(8,6)
data[discreete_features[3]].value_counts().plot(kind='bar')
plt.show()

Теперь построим гистограммы для непрерывных признаков, при этом разным цветом - разные таргеты.
Красным - где таргет 0, синим - таргет 1

figsize(20,10)
plt.figure(1)
for i in range(len(continious_features)):
    plt.subplot(231 + i)
    plt.hist(X[np.where(Y == 1)[0], continious_features[i]], bins = 100, alpha = 0.3, color = 'b', normed=True)
    plt.hist(X[np.where(Y == 0)[0], continious_features[i]], bins = 100, alpha = 0.3, color = 'r', normed=True)
    plt.title(continious_features[i])
plt.show()

Модели машинного обучения

К получившейся выборке применим различные модели Машинного Обучения

Линейные модели

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(X_train, Y_train.flatten())
lr_preds = lr.predict_proba(X_test)
lr_preds

Деревья, композиции, бустинг

from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=200, max_depth=5)
rf.fit(X_train, Y_train.flatten())
rf_preds = rf.predict_proba(X_test)
from sklearn.ensemble import GradientBoostingClassifier
bst = GradientBoostingClassifier(n_estimators=200, max_depth=5)
bst.fit(X_train, Y_train.flatten())
bst_preds = bst.predict_proba(X_test)

Оценка качества моделей

from sklearn.metrics import roc_auc_score, roc_curve, accuracy_score
import matplotlib.pyplot as plt

Качество Logistic Regression

print 'AUC', roc_auc_score(Y_test, lr_preds[:,1])
print 'accuracy', accuracy_score(Y_test, lr.predict(X_test))

AUC 0.622973940921 accuracy 0.799477967143

fpr_lr, tpr_lr, thresholds = roc_curve(Y_test, lr_preds[:,1])

figsize(8,8)
plt.plot(np.arange(0.,1.,1e-5),np.arange(0.,1.,1e-5), c='black')
plt.plot(fpr_lr,tpr_lr, c='b')
plt.title('ROC curve', size=20)
plt.xlabel('False Positive Rate', size=20)
plt.ylabel('True Positive Rate', size=20)
plt.grid()

Качество Random Forest

print 'AUC', roc_auc_score(Y_test, rf_preds[:,1])
print 'accuracy', accuracy_score(Y_test, rf.predict(X_test))

AUC 0.901276750053 accuracy 0.839091048672
fpr_rf, tpr_rf, thresholds = roc_curve(Y_test, rf_preds[:,1])

figsize(8,8)
plt.plot(np.arange(0.,1.,1e-5),np.arange(0.,1.,1e-5), c='black')
plt.plot(fpr_rf,tpr_rf, c='b')
plt.title('ROC curve', size=20)
plt.xlabel('False Positive Rate', size=20)
plt.ylabel('True Positive Rate', size=20)
plt.grid()

Качество Gradient Boosting

print 'AUC', roc_auc_score(Y_test, bst_preds[:,1])
print 'accuracy', accuracy_score(Y_test, bst.predict(X_test))

AUC 0.931830401361 accuracy 0.874405036082
fpr_gb, tpr_gb, thresholds = roc_curve(Y_test, bst_preds[:,1])

figsize(8,8)
plt.plot(np.arange(0.,1.,1e-5),np.arange(0.,1.,1e-5), c='black')
plt.plot(fpr_gb,tpr_gb, c='b')
plt.title('ROC curve', size=20)
plt.xlabel('False Positive Rate', size=20)
plt.ylabel('True Positive Rate', size=20)
plt.grid()

Кросс-валидация

from sklearn.cross_validation import ShuffleSplit, KFold
from tqdm import tqdm
cv = KFold(X.shape[0], n_folds=5, shuffle=True, random_state=123)

lr_aucs = []
lr_accs = []
rf_aucs = []
rf_accs = []
bst_aucs = []
bst_accs = []
for train_ids, test_ids in tqdm(cv):
    X_train, Y_train = X[train_ids, :], Y[train_ids, :]
    X_test, Y_test = X[test_ids, :], Y[test_ids, :]
    lr.fit(X_train, Y_train.flatten())
    lr_aucs.append(roc_auc_score(Y_test, lr.predict_proba(X_test)[:,1]))
    lr_accs.append(accuracy_score(Y_test, lr.predict(X_test)))
    
    rf.fit(X_train, Y_train.flatten())
    rf_aucs.append(roc_auc_score(Y_test, rf.predict_proba(X_test)[:,1]))
    rf_accs.append(accuracy_score(Y_test, rf.predict(X_test)))
    
    bst.fit(X_train, Y_train.flatten())
    bst_aucs.append(roc_auc_score(Y_test, bst.predict_proba(X_test)[:,1]))
    bst_accs.append(accuracy_score(Y_test, bst.predict(X_test)))

Источник

Для написания этой статьи использовалась презентация Даниила Яшкова (Yandex Data Factory), "Визуализация, машинное обучение и неструктурированные данные: практическое руководство".

python-jupyter-intro.zip
hse-course-conspect

↑ Расскажите друзьям о статье


Comments system Cackle

© EduNow.su — материалы подлежат полному/частичному копированию при указании прямой ссылки на источник. (Сегодня 24.11.17)