您的位置:首页 > 其它

机器学习--简介--第一讲

2016-10-24 00:00 99 查看


1:机器学习简介

在机器学习中,我们常常使用观察到的数据来理解系统或者程序

这里有一些具体的示例:

一个房子的各种特性怎样影响它在这个市场上的价值?

申请人的入学申请对他们能否从学校毕业起到什么影响?

在抽象层面来说,这些问题太过高水平,回答也困难。我们可以通过以下的方法细分问题。

这个房子有多少平米?是几居室?周围的犯罪指数?房龄?都影响它在市场上的价值。

申请人的大学GPA,GRE成绩影响他们是否能从学校毕业?

问的具体问题越多,我们越能通过已有的数据从机器学习的技术上来回答这些问题。

第一个问题,我们对于尝试预测出具体的,真实有价值的数字很感兴趣--一栋房子在市场上值多少美金。无论何时,我们尝试预测单个数字值时,这个过程就叫做 “回归”。

第二个问题,我们尝试预测一个双向答案---被接受或者被拒绝从学校毕业。无论何时,当我们尝试预测有两个值的问题时,这个过程叫做“分类”

在这次任务中,我们将专注于回归的具体问题。

2.数据的简介

一辆汽车的各种性能怎样影响它的燃料效率?

为了尝试回答这个问,我们将会使用来自于卡内基梅隆大学提供的一些汽车的燃料效率的一个数据集。

这个数据集是由加州大学欧文分校通过 their machine learning repository收集的。从侧面说来,当你开始着手通过机器学习研究数据,UCI机器学习仓库包含的许多小的数据集是个不错的的选择。

你会注意到这个数据文件夹里包含了很多的文件。我们将会使用 auto-mpg.data,它在燃料效率(mpg 列)缺失的8行已经被删掉了。尽管文件的后缀名是 .data, 它被重新写入了一个文本文件,并且你可以通过任何文本编译器打开它。当你通过一个文本编译器打开 auto-mpg.data ,你会注意到在文件每一行的值都通过白色的变量值加以区分。



由于文件不是以CSV文件格式存在,取而代之是使用白色变量数来给每行定界限,所以,你可以在DataFrame 里面通过read_csv读取。你需要取代之前使用的 read_table 方法,即设置 delim_whitespace 参数为 True.在值之间,使用whitespace来解析文件:

mpg = pd.read_table("auto-mpg.data", delim_whitespace=True)

不幸的是,文件并不包含列名,所以你不得不从auto-mpg.names里面获取列名并且手动的详细说明他们。列名可以在Attribute Information的部分找到。就像 auto-mpg.data,auto-mpg.names 就是一个可以通过标准文本编译器打开的文本文件。

关于auto-mpg.names,这个数据集里影响汽车燃料效率的包含7个数字特性:

cylinders----发动机里的气缸(cylinders)数量

displacement-----发动机的位移(displacement

horsepower------发动机的马力(horsepower

weight------汽车的重量。

acceleration-------汽车的加速性能

model year----汽车类型的生产年份(比如:70代表这款汽车类型始发于1970年)

当我们使用read_table 读取auto-mpg.data,你可以使用names参数去定义列表的列名,作为列表的字符串。现在让我们在DataFrame里通过读取数据集来进一步探究。

练习:使用Pandas 方法 里的read_table在cars的DataFrame中读取auto-mpg.data数据集。

.值与值之间,使用空白字符来指定你想要的分隔符

.使用auto-mpg.names的列名来设置在cars 的DataFrame列名

.使用print来显示cars的DataFrame,或者 在云端 IDE下,来进行代码检验

right answer:

columns=["mpg","cylinders","displacement","horsepower","weight","acceleration","model","year","origin"."car name"]

cars=pd.read_table("auto-mpg.data",delim_whitespace=True,names=columns)

print(cars.head(5))

3.探索性数据分析

使用这个数据集,我们可以探索更多的难题:

.cylinders, displacement, horsepower, weight, acceleration, 和model year 的数量怎样影响着燃料效率?

让我们来通过一对变量数据的探索性方式来看看哪种相互关系对燃料效率的影响最大.

练习:

.创建一个包含2行1列的网格subplots

.形成如下的数据视觉图:

.顶部的图:mpg变量作x轴,weight变量作y轴的散点图

底部的图:acceleration变量作x轴,mpg变量作y轴的散点图

fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)
cars.plot("weight", "mpg", kind='scatter', ax=ax1)
cars.plot("acceleration", "mpg", kind='scatter', ax=ax2)
plt.show()



4:线性关系

在weight 和mpg变量中隐藏了很强的负相关线性关系的散点图。在acceleration和mpg变量中,则存在很弱的正相关线性关系。让我们现在找出weight和mpg之间的额定量关系。

一个机器学习模型就是方程式,它代表从输入的值映射到输出的值。另外一种说法,机器学习就是确定自变量和因变量之间关系的一个过程。在这个案例中,因变量是燃料效率,自变量是数据集中的所有列。

在这个和接下来的几个任务中,我们将聚焦在机器学习家族里众所周知的线性模型。这个模型的公式是:

y=mx+b

x代表输入的值,参数m(斜率)和b(截距),y代表输出值.当关系是负相关线性关系,我们就期望m是负值。

5.Scikit-Learn

为了拟合数据模型,我们将会使用机器学习库的scikit-learn.Scikit-learn 是最流行用于研究中小型的数据集的机器学习模型包。尽管他在用于研究大的数据集时拟合的并不好,但scikit-learn是普遍用于初始模型,并且用在研究大的数据集子集中的机器模型。scikti-learn用于面向对象的方式,所以每一个机器学习模型在能够拟合数据集(类似于把值作图之前在Matplotlib中创造一个数字)之前必须实例化。我们将会从sklearn.linear_model中研究 LinearRegression class

from sklearn.linear_model import LinearRegression

lr = LinearRegression()

为了拟合一个数据模型,我们使用便捷地fit方法:

lr.fit(inputs, output)

输入值是一个行为n_samples,列为n_features的矩阵。输出值可以有两种形式:

.当你只需要预测一个输出值时,那么就是只有n_samples元素,或者

.当你想要同时预测多个值,则是n_samples行,n_outputs列的矩阵。

我们研究的数据集包含398行,9列,在这个数据集中,我们只想使用weight列,我们需要传入一个1列398行的矩阵。然而,假如你仅仅选出weight列并把他当作第一个参数传入到fit方法,一个错误就会被返回。这是因为 scikit-learn将会把Series和Dataframe对象转换为Numpy对象,最终在规格上无法匹配而出错。

你可以使用values attribute来查看哪个 Numpy对象会被返回:

cars["weight"].values

取代了包含行和列的矩阵,他返回了一个有398个元素的Numpy数组,你可以通过使用shape来再次确认这点。

cars["weight"].values.shape

(398,)值代表398行0列将被返回。加入你取代使用双方括号标记:

cars[["weight"]].values

将会返回一个含有398行1列的矩阵

练习:

.从sklearn.linear_model中导入LinearRegression类

.实例化一个LinearRegression例子,并把他赋值给lr

.把weight列作为输入项,mpg列作为输出项,去使用fit方法来拟合一个线性回归模型

import sklearn
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(cars[["weight"]], cars["mpg"])

6.做出预测

现在我们有一个训练的线性回归模型,我们可以使用他做出预测。这个模型输入值是重量(单位:磅),输出值是燃料效率(加伦英里)。需要使用模型做预测时,使用线性回归方法的predict.predict方法有单一参数,在矩阵中的n_features、n_sample会返回值为n_samples的一个矩阵(仅仅是一个列表)

当我们已经知道真实的燃料效率值之后,为什么还想要从训练的数据模型中做出预测?在数据预测时,测试及评估的进程中,训练数据是第一步。如果模型在训练的数据中不能起到很好的效果,我们也不能指望他在没有被训练的数据中起到很好的作用。这种情形就叫做欠拟合。

练习:

通过weight列值,使用LinearRegression方法中的predict做出一个预测

把预测出的结果列表赋值给predictions

显示predictions中的前5个元素及跟它做对比的mpg列的前5个真实值。

import sklearn
from sklearn.linear_model import LinearRegression
lr = LinearRegression(fit_intercept=True)
lr.fit(cars[["weight"]], cars[["mpg"]])
predictions = lr.predict(cars[["weight"]])
print(predictions[0:5])
print(cars["mpg"][0:5])

7.模型绘图

我们在预测燃料效率值图的旁边绘制每台汽车的实际的燃料效率值的图,以便获得效率模型的视觉化理解。

练习:

在同一个subplot:

.形成散点图:X轴weight列,Y轴mpg列,把这些散点绘制成红色

.形成一个散点图:X轴weight列,Y轴为预测值,将这些散点绘制成蓝色

plt.scatter(cars["weight"], cars["mpg"], c='red')
plt.scatter(cars["weight"], predictions, c='blue')



8误差度量

上图给了我们一个视觉观念:线性回归模型怎么执行的。为了有更多数量的理解,我们可以计算模型错误,或者在预测值和实际值之间的误差匹配。

在回归中一个通用的错误度量是mean squared error,或简写为MSE。MSE是通过计算预测值与实际值之差的平方:

(Yi^−Yi)2

Yi^是燃料效率的预测值,Yi是实际值,然后,再计算误差平方和的平均数。

MSE=1/n∑ni=1(Yi^−Yi)2

下面是在代码中同样的表达公式:

sum = 0
for each data point:
diff = predicted_value - actual_value
squared_diff = diff ** 2
sum += squared_diff
mse = sum/n

我们将会从scikit-learn中使用 mean_squared_error来计算MSE.请你导入函数,并理解怎么使用它,以便你更加适应阅读文档。

练习:

.导入mean_squared_error函数

.使用mean_squared_error函数通过预测值来计算MSE,赋值给mse

.使用print来显示MSE值

lr = LinearRegression()#fit_intercept=True)
lr.fit(cars[["weight"]], cars[["mpg"]])
predictions = lr.predict(cars[["weight"]])
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(cars["mpg"], predictions)
print(mse)

9.MSE的平方根

有许许多多的误差度量方法可以使用,每种都有自己的优缺点。尽管各种不同的误差度量的具体特性,是在本节要求之外,但我们仍然在这里介绍下误差度量。

Root mean squared error,或缩写RMSE,它是MSE的平方根,在大的不好处理的误差度量值中起到很好的作用。此外,RMSE是非常好理解的,因为他的单位与数据是相同的。当计算MSE值,我们对预测值和实际值都进行开方,计算两者的差,再计算所有差之和。这意味着MSE值的单位是每英里多少平方加仑,RMSE的单位是每英里多少加仑。

练习:

   计算预测值的RMSE,并赋值给rmse

用print显示RMSE。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: