Изменения

Перейти к: навигация, поиск
м
rollbackEdits.php mass rollback
<font color="green"># код для матрицы ошибок</font>
<font color="green">'''# Пример классификатора, способного проводить различие между всего лишь двумя</font> <font color="green">'''# классами, "пятерка" и "не пятерка" из набор данных набора рукописных цифр MNIST</font>
'''import''' numpy '''as''' np
'''from''' sklearn.datasets '''import''' fetch_openml
y = y.astype(np.uint8)
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
y_train_5 = (y_train == 5) <font color="green"># True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки</font>
y_test_5 = (y_test == 5)
sgd_clf = SGDClassifier(random_state=42) <font color="green"> #классификатор на основе метода стохастического градиентного спуска (англ. Stochastic Gradient Descent SGD)</font> sgd_clf.fit(X_train, y_train_5) <font color="green">#обучаем классификатор распозновать пятерки на целом обучающем наборе</font> <font color="green"># Для расчета матрицы ошибок сначала понадобится иметь набор прогнозов, чтобы их можно было сравнивать с фактическими целями # Можно получить прогнозы и на тестовом наборе. Но мы пока тестовый набор не трогаем. Тестовый набор используем только в самом конце проекта # после того, как будет готов классификатор, готовый кзапуску</font>
y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
print(confusion_matrix(y_train_5, y_train_pred))
<font color="green"># array([[53892, 687], # [ 1891, 3530]])</font>
Безупречный классификатор имел бы только истинно-поло­жительные и истинно отрицательные классификации, так что его матрица ошибок содержала бы ненулевые значения только на своей главной диа­гонали (от левого верхнего до правого нижнего угла):
y = y.astype(np.uint8)
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
y_train_5 = (y_train == 5) <font color="green"># True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки</font>
y_test_5 = (y_test == 5)
y_train_perfect_predictions = y_train_5 <font color="green"># притворись, что мы достигли совершенства</font>
print(confusion_matrix(y_train_5, y_train_perfect_predictions))
<font color="green"># array([[54579, 0], # [ 0, 5421]])</font>
=== Аккуратность (англ. Accuracy) ===
<font color="green"># код для для подсчета аккуратности:</font>
<font color="green">'''# Пример классификатора, способного проводить различие между всего лишь двумя '''# классами, "пятерка" и "не пятерка" из набор данных набора рукописных цифр MNIST</font>
'''import''' numpy '''as''' np
'''from''' sklearn.datasets '''import''' fetch_openml
y = y.astype(np.uint8)
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
y_train_5 = (y_train == 5) <font color="green"> # True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки</font>
y_test_5 = (y_test == 5)
sgd_clf = SGDClassifier(random_state=42) <font color="green">#классификатор на основе метода стохастического градиентного спуска (Stochastic Gradient Descent SGD)</font> sgd_clf.fit(X_train, y_train_5) <font color="green">#обучаем классификатор распозновать пятерки на целом обучающем наборе</font>
y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
<font color="green"># print(confusion_matrix(y_train_5, y_train_pred))
# array([[53892, 687]
# [ 1891, 3530]])</font> print(accuracy_score(y_train_5, y_train_pred)) <font color="green"> # == (53892 + 3530) / (53892 + 3530 + 1891 +687)</font>
<font color="green"># 0.9570333333333333</font>
=== Точность (англ. Precision) ===
Результирующая точность классификатора рассчитывается как арифметическое среднее его точности по всем классам. То же самое с полнотой. Технически этот подход называется '''macro-averaging'''.
<font color="green"># код для для подсчета точности и полноты:</font>
'''# Пример классификатора, способного проводить различие между всего лишь двумя
'''# классами, "пятерка" и "не пятерка" из набор данных набора рукописных цифр MNIST</font>
'''import''' numpy '''as''' np
'''from''' sklearn.datasets '''import''' fetch_openml
y = y.astype(np.uint8)
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
y_train_5 = (y_train == 5) <font color="green"># True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки</font>
y_test_5 = (y_test == 5)
sgd_clf = SGDClassifier(random_state=42) <font color="green"> #классификатор на основе метода стохастического градиентного спуска (Stochastic Gradient Descent SGD)</font> sgd_clf.fit(X_train, y_train_5) <font color="green">#обучаем классификатор распозновать пятерки на целом обучающем наборе</font>
y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
<font color="green"># print(confusion_matrix(y_train_5, y_train_pred))
# array([[53892, 687]
# [ 1891, 3530]])</font> print(precision_score(y_train_5, y_train_pred)) <font color="green"># == 3530 / (3530 + 687)</font> print(recall_score(y_train_5, y_train_pred)) <font color="green"># == 3530 / (3530 + 1891)</font>
<font color="green"># 0.8370879772350012 # 0.6511713705958311</font>
=== F-мера (англ. F-score) ===
''F-мера'' является хорошим кандидатом на формальную метрику оценки качества классификатора. Она сводит к одному числу две других основополагающих метрики: точность и полноту. Имея "F-меру" гораздо проще ответить на вопрос: "поменялся алгоритм в лучшую сторону или нет?"
<font color="green"># код для подсчета метрики F-mera:</font>
'''# Пример классификатора, способного проводить различие между всего лишь двумя
'''# классами, "пятерка" и "не пятерка" из набор данных набора рукописных цифр MNIST</font>
'''import''' numpy '''as''' np
'''from''' sklearn.datasets '''import''' fetch_openml
y = y.astype(np.uint8)
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
y_train_5 = (y_train == 5) <font color="green"> # True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки</font>
y_test_5 = (y_test == 5)
sgd_clf = SGDClassifier(random_state=42) <font color="green"> #классификатор на основе метода стохастического градиентного спуска (Stochastic Gradient Descent SGD)</font> sgd_clf.fit(X_train, y_train_5) <font color="green">#обучаем классификатор распознавать пятерки на целом обучающем наборе</font>
y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
print(f1_score(y_train_5, y_train_pred))
<font color="green"># 0.7325171197343846</font>
=== ROC-кривая ===
Один из способов сравнения классификаторов предусматривает измере­ние '''площади под кривой''' (англ. '''Area Under the Curve {{---}} AUC'''). Безупречный клас­сификатор будет иметь площадь под ROC-кривой ('''ROC-AUC'''), равную 1, тогда как чисто случайный классификатор - площадь 0.5.
<font color="green"># Код отрисовки ROC-кривой</font>
'''# На примере классификатора, способного проводить различие между всего лишь двумя классами
'''# "пятерка" и "не пятерка" из набор данных набора рукописных цифр MNIST</font>
'''from''' sklearn.metrics '''import''' roc_curve
'''import''' matplotlib.pyplot '''as''' plt
y = y.astype(np.uint8)
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
y_train_5 = (y_train == 5) <font color="green"># True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки</font>
y_test_5 = (y_test == 5)
sgd_clf = SGDClassifier(random_state=42) <font color="green">#классификатор на основе метода стохастического градиентного спуска (Stochastic Gradient Descent SGD)</font> sgd_clf.fit(X_train, y_train_5) <font color="green">#обучаем классификатор распозновать пятерки на целом обучающем наборе</font>
y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3, method="decision_function")
[[Файл:PR_curve.png]]
<font color="green"># Код отрисовки Precison-recall кривой</font>
'''# На примере классификатора, способного проводить различие между всего лишь двумя классами
'''# "пятерка" и "не пятерка" из набор данных набора рукописных цифр MNIST</font>
'''from''' sklearn.metrics '''import''' precision_recall_curve
'''import''' matplotlib.pyplot '''as''' plt
y = y.astype(np.uint8)
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
y_train_5 = (y_train == 5) <font color="green"># True для всех пятерок, False для в сех остальных цифр. Задача опознать пятерки</font>
y_test_5 = (y_test == 5)
sgd_clf = SGDClassifier(random_state=42) <font color="green"> #классификатор на основе метода стохастического градиентного спуска (Stochastic Gradient Descent SGD)</font> sgd_clf.fit(X_train, y_train_5) <font color="green">#обучаем классификатор распозновать пятерки на целом обучающем наборе</font>
y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)
y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3, method="decision_function")
: <math>
RMSE = \sqrt{\dfrac{1}{n}\sum \limits_{i=1}^{n}(y_i a(x_i) - \overline{y_i})^2}
</math>
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F] - К.В.Воронцов, Классификация
# [http://www.machinelearning.ru/wiki/index.php?title=CV] - К.В.Воронцов, Скользящий контроль
 
[[Категория:Машинное обучение]]
[[Категория:Классификация]]
[[Категория:Регрессия]]
1632
правки

Навигация