笔记 | 机器学习-线性回归-波士顿房价加载与查看

#%% md
### 线性回归-房价预测
#%%
# 房价的高低-一切因素: 可能面积、位置、房间布局...
import numpy as np
from sklearn import datasets # 数据集
from sklearn.linear_model import LinearRegression # 模型
#%% md
#### 加载数据、数据查看
#%%
bostonItems = datasets.load_boston() # 波士顿房价 (类似字典类型)
# target 目标值 房价 24万美金
# feature_names 特征描述
BX = bostonItems.data # 数据 | 因为这些数据影响了房价
print(BX.shape) # 506行数据 506个统计样本 13列数据 影响房价的13个属性
BX[:10,:]
#%%
SY = bostonItems.target # 目标值 | 房价 如: 24 = 24 万美金
print(SY.shape) # 506个价格 一个样本一个价格
SY[:10] # 注意这个是一维数据 无法算进行多维切片
#%%
feature_names = bostonItems.feature_names # 具体指标 (每列数据的含义) 与 data 的列一一对应
print(feature_names.shape)
feature_names.reshape(-1, feature_names.shape[0])
"""
CRIM 犯罪率
NOX 空气污染
TAX 税收
"""
#%% md
#### 数据拆分
#%%
# 506个样本拆分2份 一份占80% 训练数据 一份20% 验证数据
# 80% 交给算法进行线性回归学习, 进行拟合函数
# 20% 验证算法是否准确
#%%
# 如何拆分?
a = np.array([1,2,3,4,5,6,7])
print(a)
np.random.shuffle(a) # 洗牌 将数据打乱 | 改变原来数据
print(a)
#%%
# 将数据索引进行打乱处理来获得数据
indexItems = np.arange(BX.shape[0])
print(indexItems.shape)
np.random.shuffle(indexItems) # 由于数据打乱 结果不一定与教程相同
indexItems.reshape(-1, indexItems.shape[0])
#%%
# 进行比例计算
pro80 = int(BX.shape[0] * 0.8) # 404 | 教程写死 405
pro20 = BX.shape[0] - pro80 # 102
print(pro80, pro20)
#%%
# 进行切片
indexItems80 = indexItems[:pro80]
indexItems20 = indexItems[pro80:]
print(indexItems80.shape, indexItems20.shape)
BX80 = BX[indexItems80] # 训练数据
SY80 = SY[indexItems80] # 验证数据
BX20 = BX[indexItems20] # 训练目标
SY20 = SY[indexItems20] # 验证目标
print(BX80.shape, SY80.shape, BX20.shape, SY20.shape)
#%% md
#### 数据建模
#%%
np.set_printoptions(suppress=True) # 不使用科学技术法显示

model80 = LinearRegression(fit_intercept=True) # 训练建模 允许有截距
model80.fit(BX80, SY80) # 建模 算法 方程
i80 = model80.intercept_
c80 = model80.coef_

# 正数 正相关 越大越好
# 负数 负相关 越低越好
print(i80)
c80
#%%
# [0: 'CRIM' 1: 'ZN' 2: 'INDUS' 3: 'CHAS' 4: 'NOX' 5: 'RM' 6: 'AGE' 7: 'DIS' 8: 'RAD' 9: 'TAX' 10: 'PTRATIO' 11: 'B' 12: 'LSTAT']
"""
0 CRIM 犯罪率
3 CHAS 是否在某个注明江边
4 NOX 空气污染
5 RM 房间数量
9 TAX 税收
"""
print(feature_names)
#%% md
#### 模型验证、应用
#%%
_Y20 = model80.predict(BX20).round(2) # 将预测数据放入训练模型中进行验证 | 模型预测结果
_Y20[:30].reshape(-1, 30) # 显示 30条 预测数据放入训练模型中 的样本
#%%
SY20[:30].reshape(-1, 30) # 显示 30条测试样本 | 结果是有点上下浮动
#%% md
#### 模型评估
#%%
# 训练数据评分比较高 拟合度高
# 类似考试见过的题目
model80.score(BX80, SY80) # 训练数据得分
#%%
# 这个指标约接近 1 越优秀
# 类似考试没见过的题目
model80.score(BX20, SY20) # 评分 U和V | 测试数据 测试目标 | 最大值1可以小于0 如果评分太差就会负数
#%% md
$ R^2 = 1 - \frac{u}{v} $
#%% md
`u` is the residual sum of squares ``((y_true - y_pred) ** 2).sum()`
#%% md
`v` is the total sum of squares ``((y_true - y_true.mean()) ** 2).sum()``
#%%
# y_pred 预测值 y_true 真实值
SY_pred = model80.predict(BX20)
SY_true = SY20
#%%
u = ((SY_true - SY_pred) ** 2).sum()
u
#%%
v = ((SY_true - SY_true.mean()) ** 2).sum()
v
#%%
1 - u/v # 这个结果等于 model80.score(BX20, SY20) 平均指标
#%%
from sklearn.metrics import mean_squared_error # 最小二乘法
#%%
mean_squared_error(SY_true, SY_pred) # 测试数据误差 20%
#%%
mean_squared_error(SY80, model80.predict(BX80)) # 训练表现 居然比测试误差的还大一点
#%%
# 正规方程 求解的另一个限制是特征维度不能太多,矩阵逆运算的时间复杂度通常为 O(n**3) 。换句话说,就是如果特征数量翻倍,你的计算时间大致为原来的 2 ** 3 倍,
# 也就是之前时间的8倍。举个例子,2 个特征 1 秒,4个特征就是 8 秒,8 个特征就是 64 秒,16 个特征就是 512 秒,当特征更多的时候呢?运行时间会非常漫长~
# 以正规方程求出最优解并不是机器学习甚至深度学习常用的手段
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CY3761

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值