<jupyter_start><jupyter_text>Рецензии на imdb<jupyter_code>import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline<jupyter_output><empty_output><jupyter_text>Имеются 25000 рецензий пользователей imdb с бинарными метками, посчитанными по оценкам: 0 при оценке =7.Полные данные: https://www.kaggle.com/c/word2vec-nlp-tutorial/dataЗагрузим выбоку:<jupyter_code>imdb = pd.read_csv('labeledTrainData.tsv', delimiter='\t')
imdb.shape
imdb.head()<jupyter_output><empty_output><jupyter_text>Классы сбалансированы:<jupyter_code>imdb.sentiment.value_counts()<jupyter_output><empty_output><jupyter_text>Разобъём выборку на обучение и контроль:<jupyter_code>from sklearn.cross_validation import train_test_split
texts_train, texts_test, y_train, y_test = train_test_split(imdb.review.values, imdb.sentiment.values)<jupyter_output><empty_output><jupyter_text>Векторизуем тексты рецензий:<jupyter_code>from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer(sublinear_tf=True, use_idf=True)
X_train = vect.fit_transform(texts_train)
X_test = vect.transform(texts_test)<jupyter_output><empty_output><jupyter_text>Логистическая регрессия Настроим на векторизованных данных логистическую регрессию и посчитаем AUC:<jupyter_code>from sklearn.linear_model import LogisticRegression
from sklearn import metrics
clf = LogisticRegression()
clf.fit(X_train, y_train)
print metrics.accuracy_score(y_test, clf.predict(X_test))
print metrics.roc_auc_score(y_test, clf.predict_proba(X_test)[:, 1])<jupyter_output>0.88448
0.95540516365<jupyter_text>Признаков получилось очень много:<jupyter_code>X_train.shape<jupyter_output><empty_output><jupyter_text>Попробуем отбирать признаки с помощью лассо:<jupyter_code>clf = LogisticRegression(C=0.15, penalty='l1')
clf.fit(X_train, y_train)
print np.sum(np.abs(clf.coef_) > 1e-4)
print metrics.accuracy_score(y_test, clf.predict(X_test))
print metrics.roc_auc_score(y_test, clf.predict_proba(X_test)[:, 1])<jupyter_output>113
0.81216
0.896471598776<jupyter_text>Ещё один способ отбора признаков — рандомизированная логистическая регрессия:<jupyter_code>from sklearn.linear_model import RandomizedLogisticRegression
rlg = RandomizedLogisticRegression(C=0.13)
rlg.fit(X_train, y_train)<jupyter_output><empty_output><jupyter_text>Посмотрим, сколько признаков отбирается:<jupyter_code>np.sum(rlg.scores_ > 0)<jupyter_output><empty_output><jupyter_text>Настроим логистическую регрессию на отобранных признаках:<jupyter_code>X_train_lasso = X_train[:, rlg.scores_ > 0]
X_test_lasso = X_test[:, rlg.scores_ > 0]
clf = LogisticRegression(C=1)
clf.fit(X_train_lasso, y_train)
print metrics.accuracy_score(y_test, clf.predict(X_test_lasso))
print metrics.roc_auc_score(y_test, clf.predict_proba(X_test_lasso)[:, 1])<jupyter_output>0.82032
0.905568194979<jupyter_text>Метод главных компонент Сделаем 100 синтетических признаков с помощью метода главных компонент:<jupyter_code>from sklearn.decomposition import TruncatedSVD
tsvd = TruncatedSVD(n_components=100)
X_train_pca = tsvd.fit_transform(X_train)
X_test_pca = tsvd.transform(X_test)<jupyter_output><empty_output><jupyter_text>Обучим на них логистическую регрессию:<jupyter_code>clf = LogisticRegression()
clf.fit(X_train_pca, y_train)
print metrics.accuracy_score(y_test, clf.predict(X_test_pca))
print metrics.roc_auc_score(y_test, clf.predict_proba(X_test_pca)[:, 1])<jupyter_output>0.856
0.932861874918<jupyter_text>По 100 полученных таким способом признакам качество получается не намного хуже, чем по всем 66702!Попробуем обучить на них обучить случайный лес:<jupyter_code>from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=100)
clf.fit(X_train_pca, y_train)
print metrics.accuracy_score(y_test, clf.predict(X_test_pca))
print metrics.roc_auc_score(y_test, clf.predict_proba(X_test_pca)[:, 1])<jupyter_output>0.828
0.903574861645
{'fraction_non_alphanumeric': 0.09823031546550398, 'fraction_numerical': 0.03488073865093614, 'mean_word_length': 10.818181818181818, 'pattern_counts': {'":': 0, '<': 52, '<?xml version=': 0, '>': 56, 'https://': 1, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '14', 'dir': 'jupyter-structured-clean-dedup', 'id': '286836', 'license': 'MIT', 'n_tokens_mistral': 1711, 'n_tokens_neox': 1725, 'n_words': 230, 'path': '2 Supervised learning/Lectures notebooks/12 bonus video/imdb.ipynb', 'repo_name': 'MaxSu77/ML-DA-Coursera-Yandex-MIPT', 'size': '3899'}