Изучение регрессионных моделей машинного обучения | Навстречу 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-квадрата.

В чем разница между хорошим и плохим регрессионным анализом, зависит от способности человека понимать все детали модели, включая знания о различных гиперпараметрах и о том, как эти параметры могут быть настроены для получения модели с наилучшими характеристиками. Использование любой модели машинного обучения в качестве черного ящика без полного понимания сложности модели приведет к фальсификации модели.

Использованная литература:

  1. Машинное обучение: средство оценки линейной регрессии 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.