5.6 线性回归

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np

简单线性回归

y = ax + b

rng = np.random.RandomState(1)
x = 10 * rng.rand(50)
y = 2 * x - 5 + rng.randn(50)
plt.scatter(x, y);

from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=True)

model.fit(x[:, np.newaxis], y)

xfit = np.linspace(0, 10, 1000)
yfit = model.predict(xfit[:, np.newaxis])

plt.scatter(x, y)
plt.plot(xfit, yfit);

print("Model slope:    ", model.coef_[0])
print("Model intercept:", model.intercept_)
Model slope:     2.02720881036
Model intercept: -4.99857708555

y = a0 + a1x1 + a2x2 + ...

rng = np.random.RandomState(1)
X = 10 * rng.rand(100, 3)
y = 0.5 + np.dot(X, [1.5, -2., 1.])

model.fit(X, y)
print(model.intercept_)
print(model.coef_)
0.5
[ 1.5 -2.   1. ]

基函数回归

y = a0 + a1x1 + a2x2 + ...

y = a0 + a1x + a2x^2 + a3x^3 + ...

多项式基函数

from sklearn.preprocessing import PolynomialFeatures
x = np.array([2, 3, 4])
poly = PolynomialFeatures(3, include_bias=False)
poly.fit_transform(x[:, None])
array([[  2.,   4.,   8.],
[  3.,   9.,  27.],
[  4.,  16.,  64.]])

from sklearn.pipeline import make_pipeline
poly_model = make_pipeline(PolynomialFeatures(7),
LinearRegression())

rng = np.random.RandomState(1)
x = 10 * rng.rand(50)
y = np.sin(x) + 0.1 * rng.randn(50)

poly_model.fit(x[:, np.newaxis], y)
yfit = poly_model.predict(xfit[:, np.newaxis])

plt.scatter(x, y)
plt.plot(xfit, yfit);

高斯基函数

from sklearn.base import BaseEstimator, TransformerMixin

class GaussianFeatures(BaseEstimator, TransformerMixin):
"""Uniformly spaced Gaussian features for one-dimensional input"""

def __init__(self, N, width_factor=2.0):
self.N = N
self.width_factor = width_factor

@staticmethod
def _gauss_basis(x, y, width, axis=None):
arg = (x - y) / width
return np.exp(-0.5 * np.sum(arg ** 2, axis))

def fit(self, X, y=None):
# create N centers spread along the data range
self.centers_ = np.linspace(X.min(), X.max(), self.N)
self.width_ = self.width_factor * (self.centers_[1] - self.centers_[0])
return self

def transform(self, X):
return self._gauss_basis(X[:, :, np.newaxis], self.centers_,
self.width_, axis=1)

gauss_model = make_pipeline(GaussianFeatures(20),
LinearRegression())
gauss_model.fit(x[:, np.newaxis], y)
yfit = gauss_model.predict(xfit[:, np.newaxis])

plt.scatter(x, y)
plt.plot(xfit, yfit)
plt.xlim(0, 10);

正则化

model = make_pipeline(GaussianFeatures(30),
LinearRegression())
model.fit(x[:, np.newaxis], y)

plt.scatter(x, y)
plt.plot(xfit, model.predict(xfit[:, np.newaxis]))

plt.xlim(0, 10)
plt.ylim(-1.5, 1.5);

def basis_plot(model, title=None):
fig, ax = plt.subplots(2, sharex=True)
model.fit(x[:, np.newaxis], y)
ax[0].scatter(x, y)
ax[0].plot(xfit, model.predict(xfit[:, np.newaxis]))
ax[0].set(xlabel='x', ylabel='y', ylim=(-1.5, 1.5))

if title:
ax[0].set_title(title)

ax[1].plot(model.steps[0][1].centers_,
model.steps[1][1].coef_)
ax[1].set(xlabel='basis location',
ylabel='coefficient',
xlim=(0, 10))

model = make_pipeline(GaussianFeatures(30), LinearRegression())
basis_plot(model)

岭回归（L2 正则化）

from sklearn.linear_model import Ridge
model = make_pipeline(GaussianFeatures(30), Ridge(alpha=0.1))
basis_plot(model, title='Ridge Regression')

α参数基本上是控制所得模型复杂度的旋钮。 在极限α→0中，结果恢复标准线性回归; 在极限α→∞中，所有模型响应都将被抑制。 特别是岭回归的一个优点是，它的计算很高效 – 比原始线性回归模型，几乎不需要更多的计算成本。

套索回归（L1 正则化）

from sklearn.linear_model import Lasso
model = make_pipeline(GaussianFeatures(30), Lasso(alpha=0.001))
basis_plot(model, title='Lasso Regression')

示例：预测自行车流量

# !curl -o FremontBridge.csv https://data.seattle.gov/api/views/65db-xm6k/rows.csv?accessType=DOWNLOAD
import pandas as pd
weather = pd.read_csv('data/BicycleWeather.csv', index_col='DATE', parse_dates=True)

daily = counts.resample('d').sum()
daily['Total'] = daily.sum(axis=1)
daily = daily[['Total']] # remove other columns

days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
for i in range(7):
daily[days[i]] = (daily.index.dayofweek == i).astype(float)

from pandas.tseries.holiday import USFederalHolidayCalendar
cal = USFederalHolidayCalendar()
holidays = cal.holidays('2012', '2016')
daily = daily.join(pd.Series(1, index=holidays, name='holiday'))
daily['holiday'].fillna(0, inplace=True)

def hours_of_daylight(date, axis=23.44, latitude=47.61):
"""Compute the hours of daylight for the given date"""
days = (date - pd.datetime(2000, 12, 21)).days
* np.tan(np.radians(axis) * np.cos(days * 2 * np.pi / 365.25)))
return 24. * np.degrees(np.arccos(1 - np.clip(m, 0, 2))) / 180.

daily['daylight_hrs'] = list(map(hours_of_daylight, daily.index))
daily[['daylight_hrs']].plot()
plt.ylim(8, 17)
# (8, 17)

# temperatures are in 1/10 deg C; convert to C
weather['TMIN'] /= 10
weather['TMAX'] /= 10
weather['Temp (C)'] = 0.5 * (weather['TMIN'] + weather['TMAX'])

# precip is in 1/10 mm; convert to inches
weather['PRCP'] /= 254
weather['dry day'] = (weather['PRCP'] == 0).astype(int)

daily = daily.join(weather[['PRCP', 'Temp (C)', 'dry day']])

daily['annual'] = (daily.index - daily.index[0]).days / 365.

daily.head()

daily[['Total', 'predicted']].plot(alpha=0.5);

params = pd.Series(model.coef_, index=X.columns)
params
Mon              504.882756
Tue              610.233936
Wed              592.673642
Thu              482.358115
Fri              177.980345
Sat            -1103.301710
Sun            -1133.567246
holiday        -1187.401381
daylight_hrs     128.851511
PRCP            -664.834882
dry day          547.698592
Temp (C)          65.162791
annual            26.942713
dtype: float64

from sklearn.utils import resample
np.random.seed(1)
err = np.std([model.fit(*resample(X, y)).coef_
for i in range(1000)], 0)

print(pd.DataFrame({'effect': params.round(0),
'error': err.round(0)}))
              effect  error
Mon            505.0   86.0
Tue            610.0   83.0
Wed            593.0   83.0
Thu            482.0   85.0
Fri            178.0   81.0
Sat          -1103.0   80.0
Sun          -1134.0   83.0
holiday      -1187.0  163.0
daylight_hrs   129.0    9.0
PRCP          -665.0   62.0
dry day        548.0   33.0
Temp (C)        65.0    4.0
annual          27.0   18.0

|
1天前
|

【8月更文挑战第6天】使用Python进行数据科学是一条充满挑战和机遇的道路。本文提供了入门指南，帮助您快速上手Python数据科学。通过实践项目和资源推荐，您将能够深入学习Python数据科学，成为一名合格的数据科学家。
10 2
|
4天前
|

【8月更文挑战第3天】站在数据的海洋边，线性回归算法犹如智慧的预言家，揭示着房价的秘密。作为房地产投资者，面对复杂的市场，我们可通过收集房屋面积、位置等数据并利用Python的pandas及scikit-learn库，建立线性回归模型预测房价。通过评估模型的均方根误差(RMSE)，我们可以更精准地判断投资时机，让数据引领我们走向成功的彼岸。
9 1
|
5天前
|

“数据科学家必备！线性回归：Python中的简单武器，打造复杂预测模型
【8月更文挑战第2天】线性回归是数据科学中简单而强大的工具，用于预测自变量与因变量间的关系。在Python中可通过scikit-learn轻松实现。步骤包括：导入库、准备数据（使用numpy生成模拟数据并划分训练集/测试集）、创建并训练模型（使用LinearRegression类）、及评估模型与预测（计算均方误差并可视化结果）。掌握线性回归是理解和解决复杂预测问题的基础。
13 2
|
6天前
|

【8月更文挑战第1天】线性回归是数据科学中预测方法的基石，它假设自变量与因变量间存在线性关系并通过拟合直线来进行预测。Python的scikit-learn库简化了线性回归的实现，如使用LinearRegression类构建模型并进行训练和预测。更高级的应用包括利用scipy和statsmodels库解决复杂问题及提供统计诊断，使用多项式回归处理非线性数据，以及应用正则化技术防止过拟合。这些工具和技术使Python成为数据科学领域中强有力的预测工具。
15 2
|
6天前
|

Python数据分析高手修炼手册：线性回归算法，让你的数据说话更有力
【8月更文挑战第1天】在数据驱动时代,掌握数据分析技能至关重要。线性回归是最基础且强大的工具之一,能从复杂数据中提炼简单有效的模型。本文探索Python中线性回归的应用并通过实战示例加深理解。线性回归建立变量间线性关系模型:Y = β0 + β1*X + ε。使用scikit-learn库进行实战:首先安装必要库,然后加载数据、训练模型并评估性能。示例展示了如何使用LinearRegression模型进行房价预测,包括数据可视化。掌握线性回归,让数据“说话”更有力。
14 2
|
8天前
|

【7月更文挑战第30天】通过本文，我们了解了如何使用Python进行数据科学探索的全过程，从环境搭建、数据收集、清洗、分析到机器学习应用。Python的强大功能和丰富的库使得数据科学探索变得简单而高效。希望这篇文章能为您的数据科学之旅提供有价值的参考。随着实践的深入，您将逐渐掌握更多高级技术和方法，解锁数据背后的无限潜力。
|
8天前
|
API Python
Python高手修炼手册：精通文件系统操作，掌控I/O管理，提升编程效率
【7月更文挑战第30天】在 Python 编程中, 文件系统操作与 I/O 管理是连接程序与数据的关键。初学者常因路径错误和权限问题受挫, 而高手能自如管理文件。传统 os 和 os.path 模块易出错, pathlib 提供了更直观的对象导向 API。I/O 方面, 同步操作会阻塞程序, 异步 (如使用 aiofiles) 则能大幅提升并发能力。真正的高手不仅掌握 API, 更能预见性能瓶颈并优化代码, 实现高效与优雅。
10 1
|
20天前
|

Python大佬耗费13年，始成400页《Python工匠》手册
Python 能干的事情实在太多了，掰着指头数有点不够用。 Web 开发、数据分析、网络爬虫、自动化运维、后台开发、机器学习....... 如果你知道主攻哪个方向，只需重点去学习。不过，不论哪个方向，Python 编程的核心知识都是需要掌握的。 但是今天咱们要讨论的一件事儿，是对于一些入门了的盆友，写了不少代码，一到面试就卡bug，又或者在项目中运用Python，代码不怎么样，却自我感觉良好，结果到处出漏洞，一堆的烂摊子。 我相信，这样的朋友肯定不少，可是目前市面上能帮助大家解决这种问题的书籍又非常稀缺，今天我就给大家推荐一本能帮助你解决燃煤之急的书籍。
34 9
|
26天前
|

Python 大神修炼手册：图的深度优先&广度优先遍历，深入骨髓的解析
【7月更文挑战第12天】Python进阶必学：DFS和BFS图遍历算法。理解图概念，用邻接表建无向图，实现DFS和BFS。DFS适用于查找路径，BFS解决最短路径。通过实例代码加深理解，提升编程技能。
19 4
|
26天前
|
Python

Python (发音:[ 'paiθ(ə) n; (US) 'paiθɔn ] n. 蟒蛇，巨蛇 )，是一种面向对象的解释性的计算机程序设计语言，也是一种功能强大而完善的通用型语言，已经具有十多年的发展历史，成熟且稳定。Python 具有脚本语言中最丰富和强大的类库，足以支持绝大多数日常应用。 Python 语言的特点：
34 2