English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Прогнозирование в машинном обучении обычно делится на два класса: регрессию и классификацию.
Коротко говоря, регрессия - это прогнозирование чисел, а классификация - это маркировка данных и их归类.
Эта статья рассказывает, как с помощью Python выполнять базовую фильтрацию данных и как анализировать ошибки результатов фильтрации.
В этом примере используется функция 2-го порядка с случайными扰动 для генерации 500 точек, и затем попытка наложить данные на полиномы 1, 2 и 100-го порядков.
Цель фильтрации - чтобы на основе обучающих данных можно было бы наложить полиномиальную функцию, которая хорошо бы подходила к существующим данным и могла бы предсказывать未知ные данные.
Код таков:
import matplotlib.pyplot as plt import numpy as np import scipy as sp from scipy.stats import norm from sklearn.pipeline import Pipeline from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn import linear_model ''''' Данные генерации ''' x = np.arange(0, 1, 0.002) y = norm.rvs(0, size=500, scale=0.1) y = y + x**2 ''''' Корень из среднеквадратичной ошибки ''' def rmse(y_test, y): return sp.sqrt(sp.mean((y_test - y) ** 2)) ''''' Уровень превосходства по сравнению с средним значением, находится в диапазоне [0~1]. 0 означает, что хуже среднего значения. 1 означает идеальное прогнозирование. Эта реализация основана на документации сайта scikit-learn ''' def R2(y_test, y_true): return 1 - ((y_test - y_true)**2).sum() / ((y_true - y_true.mean())**2).sum() ''''' Это версия из книги Conway&White «Анализ примеров машинного обучения» ''' def R22(y_test, y_true): y_mean = np.array(y_true) y_mean[:] = y_mean.mean() return 1 - rmse(y_test, y_true) / rmse(y_mean, y_true) plt.scatter(x, y, s=5) degree = [1,2,100] y_test = [] y_test = np.array(y_test) for d in degree: clf = Pipeline([('poly', PolynomialFeatures(degree=d)), ('linear', LinearRegression(fit_intercept=False))]) clf.fit(x[:, np.newaxis], y) y_test = clf.predict(x[:, np.newaxis]) print(clf.named_steps['linear'].coef_) print('rmse=%.2f, R2=%.2f, R22=%.2f, clf.score=%.2f' % (rmse(y_test, y), R2(y_test, y), R22(y_test, y), clf.score(x[:, np.newaxis], y)) plt.plot(x, y_test, linewidth=2) plt.grid() plt.legend(['1','2','100'], loc='upper left') plt.show()
Результат выполнения программы выглядит следующим образом:
[-0,16140183 0,99268453]
rmse=0,13, R2=0,82, R22=0,58, clf.score=0,82
[ 0,00934527 -0,03591245 1,03065829]
rmse=0,11, R2=0,88, R22=0,66, clf.score=0,88
[ 6,07130354e-02 -1,02247150e+00 6,66972089e+01 -1,85696012e+04
......
-9,43408707e+12 -9,78954604e+12 -9,99872105e+12 -1,00742526e+13
-1,00303296e+13 -9,88198843e+12 -9,64452002e+12 -9,33298267e+12
-1,00580760e+12]
rmse=0,10, R2=0,89, R22=0,67, clf.score=0,89
Показанные coef_ - это параметры многочлена. Например, результат拟合 с одной степенью равен
y = 0,99268453x -0,16140183
Здесь следует отметить несколько моментов:
1. Анализ ошибки.
Для анализа регрессии常用的误差 - это корень из среднеквадратичной ошибки (RMSE) и R-квадрат (R2).
RMSEявляется средним значением квадратного корня из квадратов ошибки предсказания и истинного значения. Этот метод измерения очень популярен (метод оценки в конкурсе машинного обучения Netflix), и это количественный метод权衡.
R2Метод заключается в сравнении значения предсказания с значением, полученным только с использованием среднего значения, чтобы увидеть, насколько лучше это.
Метод вычисления R2 в различных литературах несколько различается. Например, функция R2 в этой статье реализована на основе документа с официального сайта scikit-learn, и её результат соответствует функции clf.score.
Реализация функции R22 происходит из книги Conway "Анализ примеров машинного обучения", отличием является то, что он использует比值 двух RMSE для вычисления R2.
Когда степень многочлена равна 1,虽然拟合效果不太好,但R2也能达到0,82。二次多项ный повысил R2 до 0,88. А когда степень提高到100, R2 повысился всего до 0,89.
2. Переобучение.
Использование многочлена степени 100 для подгонки действительно даёт более высокий эффект, но способность модели к измерению ужасна.
И, кстати, обратите внимание на коэффициенты полинома, среди которых есть много больших значений, даже достигающих 10 в 12 степени.
Здесь мы изменяем код, удаляя последние 2 образца из обучающей выборки из 500 образцов. Однако в тесте все же тестируются все 500 образцов.
clf.fit(x[:498, np.newaxis], y[:498])
Результаты полиномиального fitted после этой модификации таковы:
[-0.17933531 1.0052037 ]
rmse=0.12, R2=0.85, R22=0.61, clf.score=0.85
[-0.01631935 0.01922011 0.99193521]
rmse=0.10, R2=0.90, R22=0.69, clf.score=0.90
...
rmse=0.21, R2=0.57, R22=0.34, clf.score=0.57
Просто отсутствуют последние 2 обучающих образца, прогноз红线 (результат fitted 100-го степенного полинома) произошел значительный отклонение, R2 также резко упал до 0.57.
Напротив, результаты fitted полинома 1-го и 2-го степеней, R2略微 увеличился.
Это означает, что высокостепенные полиномы переобучаются训练очным данным, включая большое количество шума, что приводит к полному исчезновению способности предсказывать тенденции данных. Ранее также было замечено, что значения коэффициентов fitted 100-го степенного полинома无比 велики. Люди естественно думают, что можно избежать образования таких аномальных функций fitted, ограничив размеры этих коэффициентов в процессе fitted.
Ее основная идея заключается в том, чтобы добавить сумму абсолютных значений всех коэффициентов fitted полинома (регуляризация L1) или сумму квадратов (регуляризация L2) к модели наказания, и определить коэффициент наказания w, чтобы предотвратить образование таких аномальных коэффициентов.
Эта идея применяется в методах регрессии Ridge (с использованием регуляризации L2), метода Lasso (с использованием регуляризации L1), эластичного nets (Elastic net, с использованием регуляризации L1+L2) и других, и эффективно предотвращает переобучение. Более подробную информацию можно найти в соответствующих источниках.
Давайте рассмотрим пример с регрессией Ridge (с использованием регуляризации L2) и看看, эффективна ли настройка 100-го степенного полинома. Измените код следующим образом:
clf = Pipeline([('poly', PolynomialFeatures(degree=d)),
('linear', linear_model.Ridge ())])
clf.fit(x[:400, np.newaxis], y[:400])
Результаты таковы:
[ 0. 0.75873781]
rmse=0.15, R2=0.78, R22=0.53, clf.score=0.78
[ 0. 0.35936882 0.52392172]
rmse=0.11, R2=0.87, R22=0.64, clf.score=0.87
[ 0.00000000e+00 2.63903249e-01 3.14973328e-01 2.43389461e-01
1.67075328e-01 1.10674280e-01 7.30672237e-02 4.88605804e-02
......
3.70018540e-11 2.93631291e-11 2.32992690e-11 1.84860002e-11
1.46657377e-11]
rmse=0.10, R2=0.90, R22=0.68, clf.score=0.90
可以看到, коэффициенты параметров 100-го полинома стали очень малыми. Большинство из них接近于 0.
Кроме того, следует отметить, что после использования моделей наказания, таких как регрессия с ригом, значения R2 для линейной регрессии первого и второго порядков могут быть немного ниже, чем для базовой линейной регрессии.
Однако такой модель, даже если использовать 100 раз полиномиальное, при обучении 400 образцов и прогнозировании 500 образцов, не только имеет меньшую ошибку R2, но и обладает отличной способностью к прогнозированию.
Вот и все, что было в этой статье, надеюсь, это поможет вам в изучении, и希望大家多多支持呐喊教程。
Объявление: содержание этой статьи взято из Интернета, авторские права принадлежат соответствующему автору, контент предоставлен пользователями Интернета, сайт не обладает правами собственности, не был обработан вручную, и не несет ответственности за связанные с этим юридические последствия. Если вы обнаружите спорное содержание, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для сообщения о нарушении,并提供 соответствующие доказательства. При обнаружении факта нарушения, сайт незамедлительно удалят спорное содержимое.