李宏毅机器学习课程笔记-2.5线性回归Python实战
本文为作者学习李宏毅机器学习课程时参照样例完成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实战的更多相关文章
- 斯坦福CS229机器学习课程笔记 Part1:线性回归 Linear Regression
机器学习三要素 机器学习的三要素为:模型.策略.算法. 模型:就是所要学习的条件概率分布或决策函数.线性回归模型 策略:按照什么样的准则学习或选择最优的模型.最小化均方误差,即所谓的 least-sq ...
- Andrew Ng机器学习课程笔记--汇总
笔记总结,各章节主要内容已总结在标题之中 Andrew Ng机器学习课程笔记–week1(机器学习简介&线性回归模型) Andrew Ng机器学习课程笔记--week2(多元线性回归& ...
- Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)
title: Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归) tags: 机器学习, 学习笔记 grammar_cjkRuby: true --- 之前看过一遍,但是总是模 ...
- Andrew Ng机器学习课程笔记(一)之线性回归
Andrew Ng机器学习课程笔记(一)之线性回归 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7364598.html 前言 ...
- Andrew 机器学习课程笔记
Andrew 机器学习课程笔记 完成 Andrew 的课程结束至今已有一段时间,课程介绍深入浅出,很好的解释了模型的基本原理以及应用.在我看来这是个很好的入门视频,他老人家现在又出了一门 deep l ...
- 【读书笔记与思考】Andrew 机器学习课程笔记
Andrew 机器学习课程笔记 完成 Andrew 的课程结束至今已有一段时间,课程介绍深入浅出,很好的解释了模型的基本原理以及应用.在我看来这是个很好的入门视频,他老人家现在又出了一门 deep l ...
- Andrew Ng机器学习课程笔记(五)之应用机器学习的建议
Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.h ...
- Andrew Ng机器学习课程笔记(四)之神经网络
Andrew Ng机器学习课程笔记(四)之神经网络 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7365730.html 前言 ...
- Andrew Ng机器学习课程笔记(三)之正则化
Andrew Ng机器学习课程笔记(三)之正则化 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7365475.html 前言 ...
随机推荐
- 为什么不用UUID做主键?
不易于存储:UUID太长,16字节128位,通常以36长度的字符串表示,很多场景不适用. 信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位 ...
- DevOps Workshop | 代码管理入门:基于代码扫描实现团队效率提升
CODING「DevOps Workshop 学习营地」持续火热进行中! 在这里,你可以轻松实践 DevOps 全流程.体验高效的云端开发.赢取精美礼品--第二期大奖「戴尔 U2718Q 显示器」将于 ...
- react高阶组件的一些运用
今天学习了react高阶组件,刚接触react学习起来还是比较困难,和大家分享一下今天学习的知识吧,另外缺少的地方欢迎补充哈哈 高阶组件(Higher Order Components,简称:HOC) ...
- 【2020.12.02提高组模拟】A组反思
55,rk47 T1 赛时先想了\(trie\),想到不一定是前缀,然后就放弃转为打暴力 得分:\(RE22\) 正解是只用判断\(i\)与\(i+1\)的关系,那么只有两种情况,判断一下然后\(dp ...
- cf div2 round 688 题解
爆零了,自闭了 小张做项目入职字节 小李ak wf入职ms 我比赛爆零月薪3k 我们都有光明的前途 好吧,这场感觉有一点难了,昨天差点卡死在B上,要不受O爷出手相救我就boom zero了 第一题,看 ...
- Python中字符串使用单引号、双引号标识和三引号标识,什么是三引号?什么情况下用哪种标识?
一.三引号是指三个单引号或者三个双引号: 二.Python中字符串如果以单引号.双引号标识和三引号标识开头,则字符串结尾也必须是对应的标识,不能变更: 三.三者的异同: 1.三者都是字符串,大部分情况 ...
- 《深入理解计算机系统》(CSAPP)读书笔记 —— 第一章 计算机系统漫游
本章通过跟踪hello程序的生命周期来开始对计算机系统进行学习.一个源程序从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止.我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念 ...
- Jenkins 如何实现 拷贝文件到网络共享目录
在使用jenkins中,发现拷贝文件时,不能在脚本中直接添加脚本实现. 我实现的一种方法,希望能对您有用. net use y: \\server_name\workspace "passw ...
- 关于select下拉框选择触发事件
最开始使用onclick设置下拉框触发事件发现会有一些问题: <select> <option value="0" onclick="func0()&q ...
- v-clickoutsides
//点击目标元素外侧触发特定事件 使用 v-clickoutsides="clickHandler" import Vue from 'vue' Vue.directive('cl ...