本文为作者学习李宏毅机器学习课程时参照样例完成homework1的记录。

  • 任务描述(Task Description)

    现在有某地空气质量的观测数据,请使用线性回归拟合数据,预测PM2.5。

  • 数据集描述(Dataset Description)

    • train.csv

      该文件中是2014年每月前20天每小时的观察数据,每小时的数据是18个维度的(其中之一是PM2.5)。

    • test.csv

      该文件中包含240组数据,每组数据是连续9个小时的所有观测数据(同样是18个维度)。

      请预测每组数据对应的第10个小时的PM2.5数值。

  • 结果格式

    要求上交结果的格式为CSV文件。

    第一行必须是id,value

    从第二行开始每行分别为id值及预测的PM2.5数值,两者用逗号间隔

  • 总结

    • 数据处理

      • 将数据处理、转换成什么形式,要根据数据集格式、任务来确定。
      • 要熟练掌握pandas、numpy等数据处理工具,特别是要知道它们能实现什么功能。
  • 参考链接

    https://colab.research.google.com/drive/131sSqmrmWXfjFZ3jWSELl8cm0Ox5ah3C

  • Python代码

    import pandas as pd
    import numpy as np
    import csv ## 读取数据
    data = pd.read_csv('./train.csv', encoding = 'big5') # 读取训练集
    # print(data.describe()) ## 数据预处理
    data = data.iloc[:, 3:] # 不需要使用前三列的表头,所以删除
    data[data == 'NR'] = 0 # 将非数值NR改为0
    raw_data = data.to_numpy() # pandas转numpy数组,形状是4320(=18*20*12)*24
    # print(raw_data.shape) ## 修改数据格式
    # 数据格式为12(month)*18(features)*480(=24*20hours),即12个月、每个月有480小时的数据(18维)
    month_data = {} # 字典
    for month in range(12):
    sample = np.empty([18, 480])
    for day in range(20):
    sample[ : , 24 * day : 24 * (day + 1)] = raw_data[(month * 20 + day) * 18 : (month * 20 + day + 1) * 18, : ]
    month_data[month] = sample ## 修改数据格式
    # 数据格式为每个月有连续的480个小时,每10个小时形成1个object,每个月就有471个object,12个月就有471*12个oeject,每个object包括x(18*9的featrues)和y(1个PM2.5数值)。
    x = np.empty([471*12, 18*9], dtype=float) # 471*12行,一行是一个object的x
    y = np.empty([471*12, 1], dtype=float) # 471*12行,一行是一个object的y
    for month in range(12):
    for day in range(20):
    for hour in range(24):
    if day == 19 and hour > 14: # 最后一个10小时从第20天14小时开始,防止越界
    continue
    x[month * 471 + day * 24 + hour, :] = month_data[month][:,day * 24 + hour : day * 24 + hour + 9].reshape(1, -1) # reshape时的(1, -1)指:1行、列数自动计算
    y[month * 471 + day * 24 + hour, 0] = month_data[month][9, day * 24 + hour + 9] # 取对应的第10个小时的PM2.5的值
    # print(x, y) ## 标准化
    #关于标准化,可以看这篇文章https://www.cnblogs.com/chouxianyu/p/13872444.html
    mean_x = np.mean(x, axis=0) # 平均值,axis=0指沿着列计算平均值,即计算每列的平均值
    std_x = np.std(x, axis=0) # 标准差,axis=0指沿着列计算平均值,即计算每列的标准差
    # print(mean_x.shape, std_x.shape)
    for i in range(len(x)):
    for j in range(len(x[0])):
    if std_x[j] != 0:
    x[i][j] = (x[i][j] - mean_x[j]) / std_x[j] ## 训练
    dim = 18 * 9 + 1 # 这个+1是为了保存偏置
    w = np.zeros([dim, 1])
    x = np.concatenate((np.ones([471 * 12, 1]), x), axis=1).astype(float) # axis=1表示将两个数组按行拼接,向x中添加1是为了让其与weight中的偏置相乘
    learning_rate = 100 # 学习率
    iter_time = 1000 # 迭代次数
    adagrad = np.zeros([dim, 1])
    eps = 1e-10 # eps是避免Adagrad分母为0而加的
    for t in range(iter_time):
    loss = np.sqrt(np.sum(np.power(np.dot(x, w) - y, 2)) / 471 / 12) # RMSE
    if (t % 100 == 0):
    print(t, loss)
    gradient = 2 * np.dot(x.transpose(), np.dot(x, w) - y) # dim*1
    adagrad += gradient ** 2
    w -= learning_rate * gradient / np.sqrt(adagrad + eps)
    np.save('weight.npy', w)
    print('Training Done') ## 测试
    # 读取数据
    test_data = pd.read_csv('./test.csv',header=None, encoding='big5')
    test_data = test_data.iloc[ : , 2:] # 去除表头(前两列)
    test_data[test_data == 'NR'] = 0
    test_data = test_data.to_numpy()
    test_x = np.empty([240, 18 * 9]) # 240个object,一行是一个object的x
    # 修改数据格式
    for i in range(240):
    test_x[i, :] = test_data[i * 18 : (i + 1) * 18, : ].reshape(1, -1) # 格式和训练集一样
    # 标准化
    for i in range(len(test_x)):
    for j in range(len(test_x[0])):
    if std_x[j] != 0:
    test_x[i, j] = (test_x[i, j] - mean_x[j]) / std_x[j]
    test_x = np.concatenate((np.ones([240, 1]), test_x), axis=1).astype(float) # axis=1表示将两个数组按行拼接,向x中添加1是为了让其与weight中的偏置相乘 ## 预测
    w = np.load('weight.npy')
    ans_y = np.dot(test_x, w)
    # print('ans_y.shape', ans_y.shape)
    with open('answer.csv', mode='w', newline='') as answer_file:
    csv_writer = csv.writer(answer_file)
    csv_writer.writerow(['id', 'value'])
    for i in range(240):
    row = ['id_' + str(i), ans_y[i][0]]
    csv_writer.writerow(row)
    # print(row)

Github(github.com):@chouxianyu

Github Pages(github.io):@臭咸鱼

知乎(zhihu.com):@臭咸鱼

博客园(cnblogs.com):@臭咸鱼

B站(bilibili.com):@绝版臭咸鱼

微信公众号:@臭咸鱼的快乐生活

转载请注明出处,欢迎讨论和交流!


李宏毅机器学习课程笔记-2.5线性回归Python实战的更多相关文章

  1. 斯坦福CS229机器学习课程笔记 Part1:线性回归 Linear Regression

    机器学习三要素 机器学习的三要素为:模型.策略.算法. 模型:就是所要学习的条件概率分布或决策函数.线性回归模型 策略:按照什么样的准则学习或选择最优的模型.最小化均方误差,即所谓的 least-sq ...

  2. Andrew Ng机器学习课程笔记--汇总

    笔记总结,各章节主要内容已总结在标题之中 Andrew Ng机器学习课程笔记–week1(机器学习简介&线性回归模型) Andrew Ng机器学习课程笔记--week2(多元线性回归& ...

  3. Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)

    title: Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归) tags: 机器学习, 学习笔记 grammar_cjkRuby: true --- 之前看过一遍,但是总是模 ...

  4. Andrew Ng机器学习课程笔记(一)之线性回归

    Andrew Ng机器学习课程笔记(一)之线性回归 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7364598.html 前言 ...

  5. Andrew 机器学习课程笔记

    Andrew 机器学习课程笔记 完成 Andrew 的课程结束至今已有一段时间,课程介绍深入浅出,很好的解释了模型的基本原理以及应用.在我看来这是个很好的入门视频,他老人家现在又出了一门 deep l ...

  6. 【读书笔记与思考】Andrew 机器学习课程笔记

    Andrew 机器学习课程笔记 完成 Andrew 的课程结束至今已有一段时间,课程介绍深入浅出,很好的解释了模型的基本原理以及应用.在我看来这是个很好的入门视频,他老人家现在又出了一门 deep l ...

  7. Andrew Ng机器学习课程笔记(五)之应用机器学习的建议

    Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.h ...

  8. Andrew Ng机器学习课程笔记(四)之神经网络

    Andrew Ng机器学习课程笔记(四)之神经网络 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7365730.html 前言 ...

  9. Andrew Ng机器学习课程笔记(三)之正则化

    Andrew Ng机器学习课程笔记(三)之正则化 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7365475.html 前言 ...

随机推荐

  1. C语言初级编程实践:2048小游戏

    大部分同学学习C语言编程以后不知道能通过什么样的项目才可以锻炼自己的思维功力,2048相信大家都应该熟悉,不管是手机上还是网页版的相信大家都玩过,这个简单的控制台版本的游戏是我曾经在伟易达上班时一个嵌 ...

  2. 用了Dapper之后就不要再见到SqlConnection咯

    一.背景 前几天看公司一个新项目的底层使用了dapper,大家都知道dapper是一个非常强大的半自动化orm,帮程序员解决了繁琐的mapping问题,用起来非常爽,但我还是遇到了一件非常不爽的事情, ...

  3. Spring Boot 实现看门狗功能 (调用 Shell 脚本)

    需要实现看门狗功能,定时检测另外一个程序是否在运行,使用 crontab 仅可以实现检测程序是否正在运行,无法做到扩展,如:手动重启.程序升级(如果只需要实现自动升级功能可以使用 inotify)等功 ...

  4. Java 命名之道

    为什么需要重视命名? 好的命名即是注释,别人一看到你的命名就知道你的变量.方法或者类是做什么的! 好的命名对于其他人(包括你自己)理解你的代码有着很大的帮助! 简单举个例子说明一下命名的重要性. &l ...

  5. 第八章 Python类中常用的特殊变量和方法

    上章花了近三十章节介绍类的知识,本章估计内容也比较多,讲完这些,其实还有更多.为什么这么多类有关的知识呢,这是因为在Python里面一切皆对象,就连整型.浮点数.字符串这些比较常规的类型都是作为类来实 ...

  6. 第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样?

    第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样? 一.    案例说明 我们上节提到了,使用property函数定义的属性不要与类内已经定义的普通实例变量重 ...

  7. RedHat-Linux操作指令第1篇

    不同的linux系统切换方式会稍有一点差别 从图形界面切换到字符界面:Alt+F(1-8) 或者 Alt+Ctrl+Shift+F(1-8) 从字符界面切换回图形界面:Alt+F7 字符界面启动到图形 ...

  8. QQFishing QQ钓鱼站点搭建

    答:为什么要写这个代码? 当然不是做黑产去盗别人扣扣,也没有啥查看别人隐私信息的癖好,搭建该站点的适用对象为->使用社会工程学定向钓鱼攻击的安全渗透人员 另外管理员界面后端写的很丑+很烂,除了我 ...

  9. Python运算符可不只有加减乘除

    数学里面的加减乘除,就是运算符,但是 Python 的运算符更多样,更复杂,分为算术运算符.比较运算符.赋值运算符.位运算符.逻辑运算符.成员运算符.身份运算符.为了更直观的看到运算符的使用,本文采用 ...

  10. Scrum冲刺_Day01

    一.团队展示: 1.项目:light_note备忘录 2.队名:删库跑路队 3.团队成员 队员(不分先后) 项目角色 黄敦鸿 后端工程师.测试 黄华 后端工程师.测试 黄骏鹏 后端工程师.测试 黄源钦 ...