Рубрики
Без рубрики

Линейная регрессия, быстрое руководство

Я собираюсь предоставить быстрое руководство для метода анализа данных, предоставив краткое описание того, что … Tagged with Python, начинающие.

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

Я использую главу 15 о Числовой питон Роберта Йоханссона , Статистическое моделирование. Пэтси Библиотека Patsy предоставляет функции для определения статистических моделей с помощью простого языка формулы, вдохновленного статистическим программным обеспечением, таким как R. Библиотека Patsy предназначена для того, чтобы быть компаньонной библиотекой для статистических пакетов моделирования, таких как StatsModels. Для получения дополнительной информации о проекте и его документации см. В веб -странице http://patsy.readthedocs.org .

В качестве простейшего примера я собираюсь установить линию для некоторых 1 -размерных данных, y (x) Анкет Зная функцию f (x) позволит нам вычислить значение y для любого из значений x . Если мы не знаем функцию f (x) , но у нас есть доступ к данным для наблюдений {yi, xi} , мы можем параметризировать функцию f (x) и соответствовать значениям параметров к данные. Пример параметризации f (x) линейная модель f (x) = beta_0 + beta_1 x , где коэффициенты beta_0 и Beta_1 параметры модели.

Импорт библиотек

import patsy
import numpy as np
import pandas as pd
from scipy import stats
import statsmodels.api as sm
import statsmodels.formula.api as smf
import statsmodels.graphics.api as smg

Создание некоторых данных и построить их.

x = np.arange(0, 10, 0.1)
y = 5 * np.random.rand(len(x)) + x
# plotting the data
pl.scatter(x, y, s=10)

Установка данных в кадр данных Pandas.

data = {"y": y, "x": x}
df_data = pd.DataFrame(data)

Я прямо передаю формулу Patsy y ~ x к Обычная линейная регрессия (OLS) Анкет Обратите внимание, что мы оставляем коэффициенты в формуле модели, так как предполагается, что каждый термин в формуле имеет параметр модели в качестве коэффициента.

model = smf.ols("y ~ x", df_data)
result = model.fit()
print(result.params)

#Intercept    2.230047
#x            1.020011 (the slope)
#dtype: float64

Наконец я график подходящих значений.

pl.plot(x, result.fittedvalues, lw=2, c="k",
        label="y=ax+b, a=%.3f, b=%.3f" % (result.params["x"],
                                          result.params["Intercept"]))
pl.legend()
pl.xlabel("x")
pl.ylabel("y")
pl.show()

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

X = np.vstack([np.ones(len(x)), x]).T
beta, res, rank, sval = np.linalg.lstsq(X, y, rcond=None)
print(beta)
#[2.23004704 1.02001068]

Если X вектор в Y = beta_0 + beta_1 x У нас есть Множественная линейная регрессия , и если y является вектором, он известен как многомерная линейная регрессия . Пример множественной линейной регрессии:

### from least square fitting
y = np.array([1, 2, 3, 4, 5])
x1 = np.array([6, 7, 8, 9, 10])
x2 = np.array([11, 12, 13, 14, 15])

X = np.vstack([np.ones(5), x1, x2, x1 * x2]).T
# print(X)
beta, res, rank, sval = np.linalg.lstsq(X, y, rcond=None)
# print (beta)
# [-5.55555556e-01  1.88888889e+00 -8.88888889e-01 -1.11022302e-15]


### DesignMatrix: to create a dictionary data that maps the variable
# names to the corresponding data arrays
data = {"y": y, "x1": x1, "x2": x2}
y, X = patsy.dmatrices("y ~ 1 + x1 + x2 + x1 * x2", data)
# print (X)

### DesignMatrix from data frame
df_data = pd.DataFrame(data)
y, X = patsy.dmatrices("y ~ 1 + x1 + x2 + x1:x2", df_data, return_type="dataframe")
# print(X)

Обычная линейная регрессия (OLS) Мы можем использовать класс OLS из библиотеки StatsModels вместо использования метода нижнего уровня np.linalg.lstsq

model = sm.OLS(y, X)
result = model.fit()
# print(result.params)
# Intercept   -5.555556e-01
# x1           1.888889e+00
# x2          -8.888889e-01
# x1:x2       -7.771561e-16
# dtype: float64
# print(result.params["x1:x2"])

Мы можем напрямую передать формулу Patsy для модели при создании экземпляра модели, который полностью устраняет необходимость сначала создания матриц дизайна

model = smf.ols("y ~ 1 + x1 + x2 + x1:x2", df_data)
result = model.fit()
# print(result.params)
# Intercept   -5.555556e-01
# x1           1.888889e+00
# x2          -8.888889e-01
# x1:x2       -7.771561e-16
# dtype: float64

В качестве конкретных примеров для формулы Patsy рассмотрите следующую формулу и полученные правые побочные термины (которые мы можем извлечь из Design_info атрибут с использованием term_names атрибут):

from collections import defaultdict
data = defaultdict(lambda: np.array([]))
print(patsy.dmatrices("y ~ a", data=data)[1].design_info.term_names)
# ['Intercept', 'a']
print(patsy.dmatrices("y ~ 1 + a + b", data=data)[1].design_info.term_names)
# ['Intercept', 'a', 'b']
print(patsy.dmatrices("y ~ -1 + a + b", data=data)[1].design_info.term_names)
# ['a', 'b']
print(patsy.dmatrices("y ~ a * b", data=data)[1].design_info.term_names)
# ['Intercept', 'a', 'b', 'a:b']
print(patsy.dmatrices("y ~ a * b * c", data=data)[1].design_info.term_names)
# ['Intercept', 'a', 'b', 'a:b', 'c', 'a:c', 'b:c', 'a:b:c']
print(patsy.dmatrices("y ~ a * b * c - a:b:c", data=data)[1].design_info.term_names)
# ['Intercept', 'a', 'b', 'a:b', 'c', 'a:c', 'b:c']

Оригинал: “https://dev.to/ziaeemehr/linear-regression-quick-guide-22hg”