入门学习LinearRegression-and-LogisticRegression

通过几个例子来了解LR模型

线性回归模型

LR示例:电视广告投放

通过分析数据, 了解电视广告投入x(以百万为单位)与产品销售量y(亿元)的关系。

这里假设其关系为线性关系,y = ax + b.

In [1]:

1
2
3
4
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

In [2]:

1
2
data = pd.read_csv('data/Advertising.csv')
data.head()

Out[2]:

TV radio newspaper sales
1 230.1 37.8 69.2 22.1
2 44.5 39.3 45.1 10.4
3 17.2 45.9 69.3 9.3
4 151.5 41.3 58.5 18.5
5 180.8 10.8 58.4 12.9

In [3]:

1
data.columns

Out[3]:

1
Index(['TV', 'radio', 'newspaper', 'sales'], dtype='object')

In [4]:

1
2
3
4
5
6
# 绘制散点图
plt.figure(figsize=(16,8))
plt.scatter(data['TV'], data['sales'], c='blue')
plt.xlabel("Money spent on TV ads")
plt.ylabel("Sales")
plt.show()

img

训练linear regression模型

In [5]:

1
2
3
4
5
6
7
8
X = data['TV'].values.reshape(-1,1) # 此处reshape将原来的一行数据,变形为一列数据,-1有变形的感觉。
y = data['sales'].values.reshape(-1,1)

#print(X[:6])
# print(y)
#print(data['TV'].values[:6])
reg = LinearRegression()
reg.fit(X, y) #训练,拟合

Out[5]:

1
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

sklearn 默认是矩阵数据输入

In [6]:

1
2
3
4
display( reg.coef_ ) #coefficient 系数
display( reg.intercept_ )
array([[0.04753664]])
array([7.03259355])

In [7]:

1
2
3
4
5
6
7
print('a = {:.5}'.format(reg.coef_[0][0])) #系数是二维的
print('b = {:.5}'.format(reg.intercept_[0])) #截距为一维数组

print('线性模型为:y = {:.5}X + {:.5}'.format(reg.coef_[0][0], reg.intercept_[0]))
a = 0.047537
b = 7.0326
线性模型为:y = 0.047537X + 7.0326

In [8]:

1
type(reg.intercept_[0])

Out[8]:

1
numpy.float64

可视化训练好的模型

In [9]:

1
2
3
4
5
6
7
8
predictions = reg.predict(X)

plt.figure(figsize=(16,8))
plt.scatter(data['TV'], data['sales'], c='blue')
plt.plot(data['TV'], predictions, c='red', linewidth=5)
plt.xlabel("Money spent on TV ads")
plt.ylabel("Sales")
plt.show()

img

In [10]:

1
2
3
display( type(data['TV']) )
data['TV'].shape
pandas.core.series.Series

Out[10]:

1
(200,)

预测

假设公司希望下季度投放一亿元广告,则预期销售量几何?

投入X单位为 百万元,

In [11]:

1
2
3
predictions = reg.predict([[100],]) #sklearn的输入要求为矩阵
print("投放一亿元广告,则预期销售量为{:.5}亿元".format(predictions[0][0]))
投放一亿元广告,则预期销售量为11.786亿元

1 linear regression exercise

气温会随着海拔高度的升高而降低, 我们可以通过测量不同海拔高度的气温来预测海拔高度和气温的关系.

我们假设海拔高度和气温的关系可以使用如下公式表达: y(气温) = a * x(海拔高度) + b

理论上来讲, 确定以上公式 a 和 b的值只需在两个不同高度测试, 就可以算出来 a 和 b 的值了. 但是由于所有的设备都是有误差的, 而使用更多的高度测试的值可以使得预测的值更加准确.

我们提供了在9个不同高度测量的气温值, 请你根据今天学习的线性回归方法预测 a 和 b 的值.

根据这个公式, 我们预测一下在8000米的海拔, 气温会是多少?

数据文件请见exercise/height.vs.temperature.csv

In [12]:

1
2
3
4
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

In [13]:

1
2
data = pd.read_csv('exercise/height.vs.temperature.csv')
data.head()

Out[13]:

height temperature
0 0.0 12.834044
1 500.0 10.190649
2 1000.0 5.500229
3 1500.0 2.854665
4 2000.0 -0.706488

In [14]:

1
data.columns

Out[14]:

1
Index(['height', 'temperature'], dtype='object')

In [15]:

1
2
3
4
5
#plt.figure(figsize=(16,8))
plt.scatter(data['height'], data['temperature'], c='black')
plt.xlabel("height")
plt.ylabel("Temperature")
plt.show()

img

In [16]:

1
2
3
4
5
X = data['height'].values.reshape(-1,1)
y = data['temperature'].values.reshape(-1,1)

reg = LinearRegression()
reg.fit(X, y)

Out[16]:

1
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

In [17]:

1
2
3
4
5
a = reg.coef_[0][0]
b = reg.intercept_[0]

print("海拔height与气温temperature之间的线性回归关系为 y = {:.5}X + {:.5}".format(a, b))
海拔height与气温temperature之间的线性回归关系为 y = -0.0065695X + 12.719

In [18]:

1
2
3
4
5
6
7
8
predictions = reg.predict(X)

# 作拟合后的图
plt.scatter(data['height'], data['temperature'], c='black')
plt.plot(data['height'], predictions, linewidth=3, c='red')
plt.xlabel("height")
plt.ylabel("Temperature")
plt.show()

img

In [19]:

1
2
3
4
## 预测
predictions = reg.predict([[8000],])
print("预测一下在8000米的海拔, 气温为 {:.3} ℃".format(predictions[0][0]))
预测一下在8000米的海拔, 气温为 -39.8 ℃

In [20]:

1
2
3
display( predictions )
type(predictions)
array([[-39.8377655]])

Out[20]:

1
numpy.ndarray

2 stock prediction by LR

  • df['date'] = pd.to_datetime(df['date'])在天池中报错,有些奇怪。
  • 整体套路跟前面的操作方法差不多,但 ==K线图== 不会画.

逻辑回归模型