东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 4440|回复: 4
打印 上一主题 下一主题

[课堂笔记] 13、多项式扩展与过拟合问题_笔记

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14435
QQ
跳转到指定楼层
楼主
发表于 2018-4-8 10:40:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


13、多项式扩展与过拟合问题_笔记

  1. # -*- coding: utf-8 -*-
  2. __author__ = 'dongfangyao'
  3. __date__ = '2018/4/8'
  4. __product__ = 'PyCharm'
  5. __filename__ = 'polynomial1'



  6. # 线性回归的类
  7. from sklearn.linear_model import LinearRegression
  8. # 原始数据= 训练数据 + 测试数据  数据划分的类
  9. from sklearn.model_selection import train_test_split
  10. # 数据标准化
  11. from sklearn.preprocessing import StandardScaler

  12. from sklearn.preprocessing import PolynomialFeatures
  13. from sklearn.pipeline import Pipeline

  14. import numpy as np
  15. import pandas as pd
  16. import matplotlib as mpl
  17. import matplotlib.pyplot as plt
  18. from pandas import DataFrame
  19. import time

  20. ## 设置字符集,防止中文乱码
  21. mpl.rcParams['font.family'] = 'sans-serif'
  22. mpl.rcParams['font.sans-serif'] = 'SimHei'
  23. mpl.rcParams['axes.unicode_minus'] = False

  24. # 加载数据
  25. # 日期、时间、有功功率、无功功率、电压、电流、厨房用电功率、洗衣服用电功率、热水器用电功率
  26. path1 = 'datas/household_power_consumption_1000.txt'
  27. df = pd.read_csv(path1, sep=';', low_memory=False)
  28. # 没有混合类型的时候可以通过low_memory=False调用更多内存,加快效率)

  29. # print(df.head(2))
  30. # print(df.index)
  31. # print(df.columns)

  32. # 查看数据结构
  33. # print(df.info())

  34. # 异常数据处理(异常数据过滤)
  35. # 替换非法字符为np.nan
  36. new_df = df.replace('?', np.nan)
  37. # 只要有一个数据为空,就进行行删除操作
  38. datas = new_df.dropna(axis=0, how='any')
  39. # 观察数据的多种统计指标(只能看数值型的 本来9个的变7个了)
  40. # print(datas.describe().T)


  41. # 需求:构建时间和功率之间的映射关系,可以认为:特征属性为时间;目标属性为功率值。
  42. # 获取x和y变量, 并将时间转换为数值型连续变量

  43. # 创建一个时间函数格式化字符串
  44. def date_format(dt):
  45.     # dt显示是一个Series
  46.     # print(dt.index)
  47.     # print(dt)
  48.     t = time.strptime(' '.join(dt), '%d/%m/%Y %H:%M:%S')
  49.     return (t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)

  50. X = datas.iloc[:, 0:2]
  51. # print(X)
  52. X = X.apply(lambda x: pd.Series(date_format(x)), axis=1)
  53. # Y = datas['Global_active_power']
  54. Y = datas['Voltage']
  55. # Y = datas[4].values
  56. # print(Y.head(4))
  57. # print(X.head(4))
  58. # print(type(X))
  59. # print(type(Y))


  60. # 对数据集进行测试集、训练集划分
  61. # X:特征矩阵(类型一般是DataFrame)
  62. # Y:特征对应的Label标签或目标属性(类型一般是Series)

  63. # test_size: 对X/Y进行划分的时候,测试集合的数据占比, 是一个(0,1)之间的float类型的值
  64. # random_state: 数据分割是基于随机器进行分割的,该参数给定随机数种子;
  65. # 给一个值(int类型)的作用就是保证每次分割所产生的数数据集是完全相同的
  66. # 默认的随机数种子是当前时间戳 random_state=None的情况下
  67. X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

  68. # print(X_train.shape)
  69. # print(X_test.shape)
  70. # print(Y_train.shape)
  71. # print(Y_test.shape)

  72. # 查看训练集上的数据信息(X)
  73. print(X_train.describe().T)

  74. # 特征数据标准化(也可以说是正常化、归一化、正规化)
  75. # StandardScaler:将数据转换为标准差为1的数据集(有一个数据的映射)
  76. # scikit-learn中:如果一个API名字有fit,那么就有模型训练的含义,没法返回值
  77. # scikit-learn中:如果一个API名字中有transform, 那么就表示对数据具有转换的含义操作
  78. # scikit-learn中:如果一个API名字中有predict,那么就表示进行数据预测,会有一个预测结果输出
  79. # scikit-learn中:如果一个API名字中既有fit又有transform的情况下,那就是两者的结合(先做fit,再做transform)

  80. # 模型对象创建
  81. ss = StandardScaler()
  82. # 训练模型并转换训练集
  83. X_train = ss.fit_transform(X_train)
  84. # 直接使用在模型构建数据上进行一个数据标准化操作 (测试集)
  85. X_test = ss.transform(X_test)

  86. # print(X_train.describe().T)
  87. # print(type(X_train))
  88. # print(X_train.shape, X_train.ndim)
  89. print(pd.DataFrame(X_train).describe().T)



  90. # 多项式扩展(多项式曲线拟合):将特征与特征之间进行融合,从而形成新的特征的一个过程;
  91. # 从数学空间上来讲,就是将低维度空间的点映射到高维度空间中。
  92. # 更容易找到隐含的特性  属于特征工程的某一种操作  实际中用得比较少,一般用高斯扩展比较多 后面会讲

  93. # 作用:通过多项式扩展后,我们可以提高模型的准确率或效果

  94. # 过拟合:模型在训练集上效果非常好,但是在测试集中效果不好

  95. # 多项式扩展的时候,如果指定的阶数比较大,那么有可能导致过拟合

  96. # 从线性回归模型中,我们可以认为训练出来的模型参数值越大,就表示越存在过拟合的情况



  97. ## 时间和电压之间的关系(Linear-多项式)
  98. # Pipeline:管道的意思,讲多个操作合并成为一个操作
  99. # Pipleline总可以给定多个不同的操作,给定每个不同操作的名称即可,执行的时候,按照从前到后的顺序执行
  100. # Pipleline对象在执行的过程中,当调用某个方法的时候,会调用对应过程的对应对象的对应方法
  101. # eg:在下面这个案例中,调用了fit方法,
  102. # 那么对数据调用第一步操作:PolynomialFeatures的fit_transform方法对数据进行转换并构建模型
  103. # 然后对转换之后的数据调用第二步操作: LinearRegression的fit方法构建模型
  104. # eg: 在下面这个案例中,调用了predict方法,
  105. # 那么对数据调用第一步操作:PolynomialFeatures的transform方法对数据进行转换
  106. # 然后对转换之后的数据调用第二步操作: LinearRegression的predict方法进行预测
  107. models = [
  108.     Pipeline([
  109.         ('Poly', PolynomialFeatures()),  # 给定进行多项式扩展操作, 第一个操作:多项式扩展
  110.         ('Linear', LinearRegression(fit_intercept=False))  # 第二个操作,线性回归
  111.     ])
  112. ]
  113. model = models[0]


  114. # 模型训练
  115. t = np.arange(len(X_test))
  116. N = 5
  117. d_pool = np.arange(1, N, 1)  # 阶
  118. m = d_pool.size
  119. clrs = []  # 颜色
  120. for c in np.linspace(16711680, 255, m):
  121.     clrs.append('#%06x' % int(c))
  122. line_width = 3

  123. plt.figure(figsize=(12, 6), facecolor='w')  # 创建一个绘图窗口,设置大小,设置颜色
  124. for i, d in enumerate(d_pool):
  125.     plt.subplot(N - 1, 1, i + 1)
  126.     plt.plot(t, Y_test, 'k-', label=u'真实值', ms=10, zorder=N)
  127.     ### 设置管道对象中的参数值,Poly是在管道对象中定义的操作名称, 后面跟参数名称;中间是两个下划线
  128.     model.set_params(Poly__degree=d)  ## 设置多项式的阶乘
  129.     model.fit(X_train, Y_train)  # 模型训练
  130.     # Linear是管道中定义的操作名称
  131.     # 获取线性回归算法模型对象
  132.     lin = model.get_params()['Linear']
  133.     output = u'%d阶,系数为:' % d
  134.     # 判断lin对象中是否有对应的属性
  135.     if hasattr(lin, 'alpha_'):
  136.         idx = output.find(u'系数')
  137.         output = output[:idx] + (u'alpha=%.6f, ' % lin.alpha_) + output[idx:]
  138.     if hasattr(lin, 'l1_ratio_'):
  139.         idx = output.find(u'系数')
  140.         output = output[:idx] + (u'l1_ratio=%.6f, ' % lin.l1_ratio_) + output[idx:]
  141.     print(output, lin.coef_.ravel())

  142.     # 模型结果预测
  143.     y_hat = model.predict(X_test)
  144.     # 计算评估值
  145.     s = model.score(X_test, Y_test)

  146.     # 画图
  147.     z = N - 1 if (d == 2) else 0
  148.     label = u'%d阶, 准确率=%.3f' % (d, s)
  149.     plt.plot(t, y_hat, color=clrs[i], lw=line_width, alpha=0.75, label=label, zorder=z)
  150.     plt.legend(loc='upper left')
  151.     plt.grid(True)
  152.     plt.ylabel(u'%d阶结果' % d, fontsize=12)

  153. ## 预测值和实际值画图比较
  154. plt.suptitle(u"线性回归预测时间和电压之间的多项式关系", fontsize=20)
  155. plt.grid(b=True)
  156. plt.show()





复制代码

多项式扩展与过拟合问题1.png (75.59 KB, 下载次数: 179)

多项式扩展与过拟合问题1.png

多项式扩展与过拟合问题2.png (139.95 KB, 下载次数: 176)

多项式扩展与过拟合问题2.png

1.png (174.96 KB, 下载次数: 178)

1.png

2.png (568.79 KB, 下载次数: 178)

2.png

多项式扩展与过拟合问题3.png (199.81 KB, 下载次数: 179)

多项式扩展与过拟合问题3.png

画板 1.png (715.62 KB, 下载次数: 178)

画板 1.png

画板 2.png (917.12 KB, 下载次数: 182)

画板 2.png
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

96

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
沙发
发表于 2019-12-22 20:53:54 | 只看该作者
this is good idea
回复

使用道具 举报

0

主题

46

帖子

155

积分

注册会员

Rank: 2

积分
155
板凳
发表于 2020-3-16 23:53:13 | 只看该作者
回复

使用道具 举报

0

主题

24

帖子

54

积分

注册会员

Rank: 2

积分
54
地板
发表于 2020-3-17 12:41:06 | 只看该作者
66666666666666
回复

使用道具 举报

0

主题

90

帖子

208

积分

中级会员

Rank: 3Rank: 3

积分
208
5#
发表于 2021-7-13 09:53:00 | 只看该作者
666666666666666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-4-26 17:56 , Processed in 0.230070 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表