什么是机器学习
- 从广义上来说,机器学习是一种能够赋予机器学习的能力以此让它完成直接编程无法完成的功能的方法。
- 从实践的意义上来说,机器学习是一种通过利用数据,训练出模型,然后使用模型预测的一种方法。
两个小例子
- 瑞雪兆丰年:如果前一年冬天下雪很大很多,那么第二年庄家丰收的可能性比较大
-
沃尔玛著名的啤酒喝尿布故事
分类
- 按照方式不同主要分为三类
- 监督学习
- 通过已有的一部分输入数据与输出数据之间的对应关系,生成一个函数,将输入映射到合适的输出
- 在瑞雪兆丰年的例子中,头年降雪量就是输入,来年亩产量就是输出
- 无监督学习
- 直接对输入数据集进行建模,寻找关联
- 例如啤酒尿布的例子,只要寻找关联性,并不需要什么明确的目标值输出
- 半监督学习
- 综合利用有输入输出的数据,和只有输入的数据来进行训练。可以简单理解成监督学习和非监督学习的综合。
- 监督学习
应用
- AlphaGo
- 人脸识别
- 内容推荐
用 python 进行机器学习的小例子
- 根据某一服务器过去的访问量来预测未来的访问量(监督学习,回归算法)
-
步骤
-
读取数据
数据中第一列是小时数,第二列是那个小时访问的访问量
- 清洗数据和预处理
- 使用正确的模型和学习方法
> 数值逼近:看样本数据与函数之间的误差有多大,为了避免负数,一般会用方差def error(f, x, y): return sp.sum((f(x)-y)**2)
-
完整代码
-
import scipy as sp
import matplotlib.pyplot as plt
from scipy.optimize import fsolve
# 读入一个scipy自定义的用于科学计算的数组
data = sp.genfromtxt("web_traffic.tsv", delimiter="\t")
# print(data[:10])
# print(data.shape)
x = data[:, 0]
y = data[:, 1]
# 统计数据集中无效数据的个数
print(sp.sum(sp.isnan(y)))
# 去掉无效数据
x = x[~sp.isnan(y)]
y = y[~sp.isnan(y)]
plt.scatter(x, y, color="blue", linewidths=1)
plt.title("Web traffic over the last month")
plt.xlabel("Time")
plt.ylabel("Hits/hour")
plt.xticks([w * 7 * 24 for w in range(10)], ['week %i' % w for w in range(10)])
plt.autoscale(tight=True)
plt.grid()
# 看样本数据与函数之间的误差和有多大,为了避免负数,一般用方差
def error(f, x, y):
return sp.sum((f(x) - y) ** 2)
def f(x, y, num):
# 给定x, y, 以及期望的多项式的阶,生成拟合函数,返回模型参数
fpNum = sp.polyfit(x, y, num)
# 创建模型函数
fNum = sp.poly1d(fpNum)
# print(fNum)
# 生成x值
fxNum = sp.linspace(0, x[-1], 1000)
return fNum, fxNum
# # 拟合1阶曲线
# f1, fx1 = f(x, y, 1)
# # print("Model parameters d=1: %s" % f1)
# print("error d=1: %f" % error(f1, x, y))
# plt.plot(fx1, f1(fx1), linewidth=4, color="red")
# # 拟合2阶曲线
# f2, fx2 = f(x, y, 2)
# # print("Model parameters d=2: %s" % f2)
# print("error d=2: %f" % error(f2, x, y))
# plt.plot(fx2, f2(fx2), linewidth=4, color="orange")
#
# # 拟合3阶曲线
# f3, fx3 = f(x, y, 3)
# # print("Model parameters d=3: %s" % f3)
# print("error d=3: %f" % error(f3, x, y))
# plt.plot(fx3, f3(fx3), linewidth=4, color="orchid")
#
# # 拟合4阶曲线
# f4, fx4 = f(x, y, 4)
# # print("Model parameters d=4: %s" % f50)
# print("error d=4: %f" % error(f4, x, y))
# plt.plot(fx4, f4(fx4), linewidth=4, color="green")
# # 拟合10阶曲线
# f10, fx10 = f(x, y, 10)
# # print("Model parameters d=4: %s" % f50)
# print("error d=10: %f" % error(f10, x, y))
# plt.plot(fx10, f10(fx10), linewidth=4, color="olivedrab")
#
# # 拟合50阶曲线
# f50, fx50 = f(x, y, 50)
# # print("Model parameters d=50: %s" % f50)
# print("error d=50: %f" % error(f50, x, y))
# plt.plot(fx50, f50(fx50), linewidth=4, color="yellow")
# 角标
# plt.legend(["d=%i" % f2.order, "d=%i" % f3.order, "d=%i" % f4.order], loc="upper left")
# # 角标
# plt.legend(["d=%i" % f1.order, "d=%i" % f2.order, "d=%i" % f3.order, "d=%i" % f4.order, "d=%i" % f10.order,
"d=%i" % f50.order], loc="upper left")
# 排除过拟合,交叉验证
# inflection = int(3.5 * 7 * 24)
# print(inflection)
# xa = x[: inflection]
# ya = y[: inflection]
# xb = x[inflection:]
# yb = y[inflection:]
# fa1, fax1 = f(xa, ya, 1)
# fb1, fbx1 = f(xb, yb, 1)
\# print("error a d=1: %f" % error(fa1, x, y))
\#print("error b d=1: %f" % error(fb1, x, y))
\# plt.plot(fax1, fa1(fax1), linewidth=4, color="red")
# plt.plot(fbx1, fb1(fbx1), linewidth=4, color="black")
# f2, fx2 = f(xb, yb, 2)
# print("error b d=2: %f" % error(f2, x, y))
# plt.plot(fx2, f2(fx2), linewidth=4, color="orange")
# f3, fx3 = f(xb, yb, 3)
# print("error b d=3: %f" % error(f3, x, y))
# plt.plot(fx3, f3(fx3), linewidth=4, color="orchid")
# f4, fx4 = f(xb, yb, 4)
# print("error b d=4: %f" % error(f4, x, y))
# plt.plot(fx4, f4(fx4), linewidth=4, color="green")
# 角标
# plt.legend(["d=%i" % fb1.order, "d=%i" % f2.order, "d=%i" % f3.order, "d=%i" % f4.order], loc="upper left")
# reached_max = fsolve(f3 - 100000, 800) / (7 * 24)
# print(reached_max)
plt.show()
plt.close()
-
载入样本数据
-
拟合函数(1阶)
-
拟合函数(高阶)
-
由图可以看出 d=50, d=10 函数包含过多噪点数据,为过拟合
-
-
交叉验证,取其中训练数据的子集,如3.5周以后的数据
- 由图可以看出 d=3 时最接近训练数据,由误差值也可进一步确认 d=3 最接近数据模型
error b d=1: 30035502983.248447
error b d=2: 54112491928.515709
error b d=3: 1897459097.241541
error b d=4: 425989328061673.437500