Изучение регрессионных моделей машинного обучения | Навстречу AI
Плохой и хороший регрессионный анализ
Модели регрессии - самые популярные модели машинного обучения. Модели регрессии используются для прогнозирования целевых переменных в непрерывном масштабе. Модели регрессии находят применение практически во всех областях исследований, и в результате это одна из наиболее широко используемых моделей машинного обучения. В этой статье будут обсуждаться хорошие и плохие практики построения регрессионной модели.
Мы построим простую модель линейной регрессии (без различий между выбросами и выбросами, которые можно обработать с помощью более надежных моделей регуляризованной регрессии, таких как регрессия Лассо), а затем будем использовать ее для прогнозирования цен на жилье с использованием набора данных Housing. Мы используем выходные данные модели, чтобы выделить хорошие и плохие практики регрессионного анализа.
Более подробную информацию о наборе данных Housing можно найти в репозитории машинного обучения UCI. Блокнот Jupyter, содержащий весь код, можно найти на GitHub.
Оценщик линейной регрессии с использованием градиентного спуска
В предыдущей статье мы обсудили, как можно построить простую модель линейной регрессии для прогнозирования переменной непрерывного результата (y) с использованием одномерного набора данных, содержащего одну функцию (X): https://medium.com/ @ benjaminobi / Machine-Leaning-Python-linear-regression-Estimator-using-gradient-descent-b0b2c496e463
Реализация простой оценщика линейной регрессии в Python
class GradientDescent(object): """Gradient descent optimizer. Parameters ------------ eta : float Learning rate (between 0.0 and 1.0) n_iter : int Passes over the training dataset. Attributes ----------- w_ : 1d-array Weights after fitting. errors_ : list Error in every epoch. Methods ----------- fit(X,y): fit the linear regression model using the data. predict(X): Predict outcome for samples in X. Rsquare(X,y): Returns the R^2 value. """ def __init__(self, eta=0.01, n_iter=10): self.eta = eta self.n_iter = n_iter def fit(self, X, y): """Fit the data. Parameters ---------- X : {array-like}, shape = [n_points] Independent variable or predictor. y : array-like, shape = [n_points] Outcome of prediction. Returns ------- self : object """ self.w_ = np.zeros(2) self.errors_ = [] for i in range(self.n_iter): errors = 0 for j in range(X.shape[0]): self.w_[1:] += self.eta*X[j]*(y[j] - self.w_[0] - self.w_[1]*X[j]) self.w_[0] += self.eta*(y[j] - self.w_[0] - self.w_[1]*X[j]) errors += 0.5*(y[j] - self.w_[0] - self.w_[1]*X[j])**2 self.errors_.append(errors) return self def predict(self, X): """Return predicted y values""" return self.w_[0] + self.w_[1]*X def Rsquare(self, X,y): """Return the Rsquare value""" y_hat = self.predict(X) return 1-((y_hat - y)**2).sum()/((y-np.mean(y))**2).sum()
Применение оценщика Python: прогнозирование цен на жилье
а) Импортируйте необходимые библиотеки
import numpy as np import matplotlib.pyplot as plt import pandas as pd import seaborn as sns np.set_printoptions(precision=4)
б) Изучение набора данных о жилье
df = pd.read_csv('https://raw.githubusercontent.com/rasbt/' 'python-machine-learning-book-2nd-edition' '/master/code/ch10/housing.data.txt', header=None, sep='\s+') df.columns = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] df.head()
в) Выбор функций и стандартизация
cols = ['LSTAT', 'INDUS', 'NOX', 'RM', 'MEDV'] from sklearn.preprocessing import StandardScaler stdsc = StandardScaler() X_std = stdsc.fit_transform(df[cols].iloc[:,range(0,5)].values) # Evaluate the covariance matrix cov_mat =np.cov(X_std.T) hm = sns.heatmap(cov_mat, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 15}, yticklabels=cols, xticklabels=cols) plt.tight_layout() plt.savefig('images/10_04.png', dpi=300) plt.show()
Поскольку мы заинтересованы в прогнозировании MEDV (медианное значение домов), мы видим, что наиболее сильная корреляция обнаруживается с RM (среднее количество комнат в доме). Итак, в нашей модели мы будем использовать RM в качестве переменной-предиктора и MEDV в качестве целевой переменной:
X=X_std[:,3] # we use RM as our predictor variable y=X_std[:,4] # we use MEDV as our target variable
г) Рассчитайте значения R-квадрата для разных темпов обучения.
[GradientDescent(eta=k, n_iter=100).fit(X,y).Rsquare(X,y) for k in [0.1,0.01,0.001,0.0001,0.00001,0.000001]]
Мы получили следующий результат:
[0.297,0.312,0.482,0.483,0.308,0.047]
д) Подгонка, прогнозирование и настройка гиперпараметров
np.set_printoptions(precision=1) # plot with various axes scales plt.figure(figsize=(10,8)) # fig 1 plt.subplot(231) plt.scatter(X,y,c='steelblue', edgecolor='white', s=70,label='data') plt.plot(X, GradientDescent(eta=0.1, n_iter=100).fit(X,y).predict(X),color='black', lw=2,label='fit') plt.title('$\eta = 10^{-1}, R^2 = 0.297$ ',size=14) plt.grid(False) plt.xlabel('RM (std)',size=14) plt.ylabel('MEDV (std)',size=14) plt.legend() # fig 2 plt.subplot(232) plt.scatter(X,y,c='steelblue', edgecolor='white', s=70) plt.plot(X, GradientDescent(eta=0.01, n_iter=100).fit(X,y).predict(X),color='black', lw=2) plt.title('$\eta = 10^{-2},R^2 = 0.312$',size=14) plt.grid(False) plt.xlabel('RM (std)',size=14) plt.ylabel('MEDV (std)',size=14) # fig 3 plt.subplot(233) plt.scatter(X,y,c='steelblue', edgecolor='white', s=70) plt.plot(X,GradientDescent(eta=0.001, n_iter=100).fit(X,y).predict(X),color='black', lw=2) plt.title('$\eta =10^{-3},R^2 = 0.482$',size=14) plt.grid(False) plt.xlabel('RM (std)',size=14) plt.ylabel('MEDV (std)',size=14) # fig 4 plt.subplot(234) plt.scatter(X,y,c='steelblue', edgecolor='white', s=70) plt.plot(X, GradientDescent(eta=0.0001, n_iter=100).fit(X,y).predict(X),color='black', lw=2) plt.title('$\eta = 10^{-4}, R^2 = 0.483$ ',size=14) plt.grid(False) plt.xlabel('RM (std)',size=14) plt.ylabel('MEDV (std)',size=14) # fig 5 plt.subplot(235) plt.scatter(X,y,c='steelblue', edgecolor='white', s=70) plt.plot(X, GradientDescent(eta=0.00001, n_iter=100).fit(X,y).predict(X),color='black', lw=2) plt.title('$\eta = 10^{-5},R^2 = 0.308$',size=14) plt.grid(False) plt.xlabel('RM (std)',size=14) plt.ylabel('MEDV (std)',size=14) # fig 6 plt.subplot(236) plt.scatter(X,y,c='steelblue', edgecolor='white', s=70) plt.plot(X,GradientDescent(eta=0.000001, n_iter=100).fit(X,y).predict(X),color='black', lw=2) plt.title('$\eta =10^{-6},R^2 = 0.047$',size=14) plt.grid(False) plt.xlabel('RM (std)',size=14) plt.ylabel('MEDV (std)',size=14) plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.4, wspace=0.35) plt.show()
Вот результат:
Общие замечания и заключение
Используя нашу простую регрессионную модель, мы могли видеть, что надежность нашей модели зависит от настройки гиперпараметров. Если мы просто выберем случайное значение для скорости обучения, такое как eta = 0,1, это приведет к плохой модели. Если выбрать слишком маленькое значение эта, например, эта = 0,00001, модель также будет плохой. Наш анализ показывает, что лучший выбор - это когда eta = 0,0001, как видно из значений R-квадрата.
В чем разница между хорошим и плохим регрессионным анализом, зависит от способности человека понимать все детали модели, включая знания о различных гиперпараметрах и о том, как эти параметры могут быть настроены для получения модели с наилучшими характеристиками. Использование любой модели машинного обучения в качестве черного ящика без полного понимания сложности модели приведет к фальсификации модели.
Использованная литература:
- Машинное обучение: средство оценки линейной регрессии Python с использованием градиентного спуска, Бенджамин О. Тайо (https://medium.com/@benjaminobi/machine-leaning-python-linear-regression-estimator-using-gradient-descent-b0b2c496e463 ).
2. «Машинное обучение Python», 2-е издание, Себастьян Рашка.
3. Репозиторий машинного обучения UCI по адресу https://archive.ics.uci.edu/ml/machine-learning-databases/housing/.
4. Блокнот Jupyter, содержащий весь код, использованный в этой статье, находится здесь: https://github.com/bot13956/python-linear-regression-estimator.