机器学习的目的主要是找到目标值 T和 一堆数据之间的关系,而确定机器学习中的关系的方法有:分类和回归。
怎么去区分分类和回归呢?看目标值 是定性的值还是定量
A: 预测明天是多少度?数据有今天的度数x,天气情况y(晴天,雨天,阴天);
B: 预测明天是什么天气?数据有今天的度数x,天气情况y(晴天,雨天,阴天);
一起来看看A和B两个例子;今天的度数x是一个连续的值;而天气情况确实一个类别,三种情况选其一;
回归分析(Regression Analysis)是统计学的数据分析方法,目的在于了解两个或多个变量间是否相关、相关方向与强度,并建立数学模型以便观察特定变量来预测其它变量的变化情况。
线性回归 = 线性 + 回归
线性回归算法(Linear Regression)的建模过程就是使用数据点来寻找最佳拟合线。公式,y = mx + c,其中 y 是因变量,x 是自变量,利用给定的数据集求 m 和 c 的值。
线性回归又分为两种类型,即 简单线性回归(simple linear regression),只有 1 个自变量;*多变量回归(multiple regression),至少两组以上自变量。
看的糾結. 來看下StatQuest的例子
图片来源:StatQuest
在StatQuest例子中,需要找到老鼠体重和老鼠尺寸大小之间的关系,数据点如上图。看着线性关系挺明显的。
第一步:假设关系
老鼠大小 = a * 老鼠体重 + b
怎么确定a和b的值就是线性回归的目标。
顺便提一下,这个就是假设函数 h(x),h代表的是假设英文的头字母(Hypothesis)
根据数据,我们可以画出无数条线来表示这个线性关系。到底怎么去选择最优的呢?
不管画的线如何变,数学表达式不会变。
老鼠大小 = a * 老鼠体重 + b
在已知的数据中,老鼠体重是对应的一个实际值的,定义为 实际值_i;
| 预测值_S - 实际值_R | 又造出了一个 损失函数(Cost Function),也就是说所决定的关系要使得 损失函数最小。
图片来源:StatQuest
夠煩了, 試試吧!
预测波士顿的房价, 波士顿房价数据集包含波士顿郊区住房价值的信息。
一、数据介绍
此数据是一份源于美国某经济学杂志上,分析研究波士顿房价( Boston House
Price)的数据集。数据集中的每一行数据都是对波士顿周边或城镇房价的描述:
CRIM: 城镇人均犯罪率
ZN: 住宅用地所占比例
INDUS: 城镇中非住宅用地所占比例
CHAS: CHAS 虚拟变量,用于回归分析
NOX: 环保指数
RM: 每栋住宅的房间数
AGE: 1940 年以前建成的自住单位的比例
DIS: 距离 5 个波士顿的就业中心的加权距离。
RAD: 距离高速公路的便利指数
TAX: 每一万美元的不动产税率
PRTATIO: 城镇中的教师学生比例
B: 城镇中的黑人比例
LSTAT: 地区中有多少房东属于低收入人群
MEDV: 自住房屋房价中位数(也就是均价)
二、任务介绍
1、通过数据挖掘对影响波士顿房价的因素进行分析。
2、搭建一个波士顿房价预测模型。
数据预处理与特征分析
MEDV作为目标变量,也就是因变量,其他变量作为自变量。
特征选择
特征维度较大,为了保证模型的高效预测,需要进行特征选择。每种特征都有自己含义和数据量级,单纯地依靠方差来判断可能效果不好,直接使用与目标变量的相关性强的变量作为最终的特征变量。
通过相关系数法进行特征选择
import pandas as pd
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
#把数据转化成pandas的形式,在列尾加上房价PRICE
boston_dataset=datasets.load_boston()
data=pd.DataFrame(boston_dataset.data)
data.columns=boston_dataset.feature_names
data['PRICE']=boston_dataset.target
#取出房间数和房价并转化成矩阵形式
x=data.loc[:,'RM'].values
y=data.loc[:,'PRICE'].values
#进行矩阵的转置
x=np.array([x]).T
y=np.array([y]).T
#训练线性模型
l=LinearRegression()
l.fit(x,y)
#画图显示
plt.scatter(x,y,s=10,alpha=0.3,c='red')
plt.plot(x,l.predict(x),c='blue',linewidth='2')
plt.xlabel("X")
plt.ylabel("Y")
plt.show()