什么是回归
回归的就是整合+预测
-
回归处理的问题可以预测:
-
预测房价
-
销售额的预测
-
设定贷款额度
-
可以根据事物的相关特征预测出对应的结果值
概念对比
其实回归算法是相对分类算法而言的,最终都可以得到一个想要的预测结果,但二者区别与我们想要预测的目标变量y的值类型有关。
1.如果目标变量y是离散型变量,如预测用户的性别(男、女),预测月季花的颜色(红、白、黄……),预测是否患有肺癌(是、否),那我们就需要用分类算法去拟合训练数据并做出预测;
2.如果y是连续型变量,如预测用户的收入(4千,2万,10万……),预测员工的通勤距离(500m,1km,2万里……),预测患肺癌的概率(1%,50%,99%……),我们则需要用回归模型。
定义
线性回归(Linear Regression)就是一种用于建立和分析关于两个或多个变量之间线性关系的统计方法和机器学习算法。它被广泛应用于预测和建模任务,尤其是用于预测数值型输出(连续型变量)。
一元线性回归
线性回归可以说是用法非常简单、,作为机器学习的入门算法非常合适。我们上中学的时候,都学过二元一次方程,我们将y作为因变量,x作为自变量,得到方程:
当给定参数β0和β1的时候,画在坐标图内是一条直线(“线性”)。
当我们只用一个x来预测y,就叫一元线性回归,也就是在找一个直线来拟合数据。
比如,我有一组数据画出来的散点图,横坐标代表广告投入金额,纵坐标代表销售量,线性回归就是要找一条直线,并且让这条直线尽可能地拟合图中的数据点。
这里我们得到的拟合方程是y = 0.0512x + 7.1884,此时当我们获得一个新的广告投入金额后,我们就可以用这个方程预测出大概的销售量。
基本思想
线性回归的基本思想是寻找自变量(输入特征)与因变量(输出目标)之间的线性关系,即一个线性方程,用来描述这些变量之间的关系。一般来说,线性回归模型的方程如下:
强调:目标就是找到最佳系数:[b]
线性回归适用于以下情况:
- 希望理解和建模两个或多个变量之间的线性关系。
- 需要进行数值型输出的预测。
- 需要估计特征对目标变量的影响。
- 需要进行简单的模型解释和解释能力较强的建模。
线性回归是机器学习和统计学中最简单但也是最有用的工具之一,它为许多预测问题提供了一个坚实的基础。在实际应用中,线性回归通常有多种变体,如多元线性回归、岭回归、Lasso回归等,以适应不同问题的需求。
注意 :做线性回归,不要忘了前提假设是y和x呈线性关系,如果两者不是线性关系,就要选用其他的模型啦。
相关python库与模块介绍
Sklearn
Sklearn (全称 Scikit-Learn) 是基于 Python 语言的机器学习工具。它建立在 NumPy, SciPy, Pandas 和 Matplotlib 之上,里面的 API 的设计非常好,所有对象的接口简单,很适合新手上路。在 Sklearn 里面有六大任务模块:分别是分类、回归、聚类、降维、模型选择和预处理。
要使用上述六大模块的方法,可以用以下的伪代码,注意 import 后面我用的都是一些通用名称,如 SomeClassifier, SomeRegressor, SomeModel,具体化的名称由具体问题而定,比如
- SomeClassifier = RandomForestClassifier
- SomeRegressor = LinearRegression
- SomeModel = KMeans, PCA
- SomeModel = GridSearchCV, OneHotEncoder
上面具体化的例子分别是随机森林分类器、线性回归器、K 均值聚类、主成分分析、网格追踪法、独热编码。
分类 (Classification)
from sklearn import SomeClassifier
from sklearn.linear_model import SomeClassifier
from sklearn.ensemble import SomeClassifier
回归 (Regression)
from sklearn import SomeRegressor
from sklearn.linear_model import SomeRegressor
from sklearn.ensemble import SomeRegressor
聚类 (Clustering)
from sklearn.cluster import SomeModel
降维 (Dimensionality Reduction)
from sklearn.decomposition import SomeModel
模型选择 (Model Selection)
from sklearn.model_selection import SomeModel
预处理 (Preprocessing)
from sklearn.preprocessing import SomeModel
Numpy
NumPy( Numerical Python) 是 Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
pandas
Pandas 是一个开源的 Python 数据分析库,提供高性能、易用的数据结构和数据分析工具。它是基于 NumPy 库构建的,使得处理大型数据集变得快速而简单。
Pandas 最主要的两个数据结构是:
-
Series
: 一维带标签数组,可以存储任何数据类型(整数、字符串、浮点数、Python 对象等)。其轴标签统称为索引。 -
DataFrame
: 二维带标签数据结构,可以看作是不同类型数据的表格或者 Series 的容器。DataFrame 是用于数据操纵与分析的最常用工具。
使用 Pandas,你可以快速进行以下操作:
- 数据清洗和准备
- 数据聚合和关联
- 数据过滤、选择及转换
- 数据的导入和导出
- 时间序列分析
Pandas 强大之处在于它提供了许多内置方法来进行数据操作,使得数据分析任务更加简便。
例如,读取 CSV 文件到 DataFrame 只需要一行代码:
import pandas as pd
df = pd.read_csv('data.csv')
然后可以对这个 DataFrame
进行各种操作,比如:
- 计算描述性统计信息
df.describe()
- 筛选某些数据
filtered_df = df[df['column_name'] > some_value]
- 将处理后的数据存储到新的文件中:
df.to_csv('processed_data.csv', index=False)
Pandas 的灵活性和易用性使其成为 Python 数据分析工具中最受欢迎的库之一。
Matplotlib
Matplotlib 是Python中类似MATLAB的绘图工具,熟悉 MATLAB 也可以很快的上手 Matplotlib。
pyplot
pyplot 是 matplotlib库中的一个模块,它提供了一个类似于 MATLAB 的绘图系统。pyplot 用于创建和操作图形及其元素,例如线条、标记、文本和图例等。用户可以使用它来生成简单或复杂的图表,比如条形图、直方图、散点图、线图等。
以下是一些基础的 pyplot 功能:
plot()
: 绘制线性图scatter()
: 绘制散点图bar()
: 绘制条形图hist()
: 绘制直方图imshow()
: 显示图像数据figure()
: 创建新的图形窗口xlabel()
,ylabel()
: 设置轴标签title()
: 设置图形标题legend()
: 添加图例show()
: 显示图形
为了使用 pyplot
,首先需要导入模块:
import matplotlib.pyplot as plt
线性回归案例
单特征:价格预测
假设有例子,x和y分别表示某面积和总价,需要根据面积来预测总价。
第一步:导入模块
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
第二步:导入数据并绘制散点图
# 创建数据
x = np.array([6, 16, 26, 36, 46, 56]).reshape((-1, 1))
#reshape(x,y)是对array数组的切割即分为x行y列,可以接收特殊的参数 -1,表示该维度的大小将自动计算以符合数组的总大小。
y = np.array([4, 23, 10, 12, 22, 35])
plt.scatter(x, y)
# 绘制散点图
plt.show()
#展示图像
第三步:创建模型并拟合
model = LinearRegression().fit(x, y)
LinearRegression()
- LinearRegression()是来创建一个新的线性回归模型实例。
fit()
- fit()这部分是在调用 fit 方法对数据进行拟合。其中,x 通常表示特征数据(自变量),y 表示目标数据(因变量)。在机器学习中,x 通常是一个二维数组(或者是类似的结构),每一行代表一个数据点,每一列代表一个特征;y 通常是一个一维数组,代表每个数据点对应的输出结果。
所以,改代码等效于:
1.创建线性回归模型实例
model = LinearRegression()
2.训练模型
model.fit(x, y)
第四步:评估模型
r_sq = model.score(x, y)
print('决定系数:', r_sq)
score()
score函数通常是一个模型对象的方法,用于评估模型的性能。在 scikit-learn
库中,大多数模型类都有一个 score
方法。
这个方法的工作原理如下:
- 对于分类模型,
score
方法通常返回准确率(accuracy),即正确预测的样本比例。 - 对于回归模型,则常常返回 R² 分数(所以变量命名为r_sq),也称为决定系数,是一个衡量模型拟合优度的指标。
第五步:获取线性回归模型中的参数
# 打印截距:
print('截距:', model.intercept_)
# 打印斜率
print('斜率:', model.coef_)
# 预测一个响应并打印它:
y_pred = model.predict(x)
print('预测结果:', y_pred, sep='\n')
predict()
predict()
: 是多数scikit-learn
模型中的一个方法,用于生成模型的输出预测。当你传入一组输入特征x
时,predict()
方法会应用学习到的模型参数对这些数据进行预测。x
: 是待预测的数据集,其结构应该与模型训练时使用的特征数据相同。例如,如果模型是用一个包含5个特征的数据集训练的,那么x
也应该有相同数目的特征。
输入示范
多特征:房价预测
y=c+m1x1+m2x2+…+mn*xn
- y是预测值,是因变量
- c是截距
- m1是第一个特征
- m2是第二个特征
- mn是第n个特征
第一步:导入库
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression #导入线性回归模块
from sklearn.metrics import mean_squared_error, r2_score
boston = datasets.load_boston()
'''
这行代码载入了scikit-learn库中的波士顿房价数据集。load_boston()函数返回一个类似于字典的对象,其中包含波士顿房屋价格的数据以及与之相关的各种信息。
具体来说,加载的数据集包括以下部分:
- `data`: 包含了对于504个波士顿房产的13个特征变量的数据。
- `target`: 房产的中值价格,这是一个连续的目标变量。
- `feature_names`: 特征名称的数组。
- `DESCR`: 数据集的详细描述。
- `filename`: 文件的物理位置(如果数据是从文件中加载的)。
'''
datasets
- scikit-learn(机器学习库)中 datasets 模块,这个模块包含了很多可以直接用于实践机器学习算法的真实世界数据集。
train_test_split()
-
scikit-learn 中的 model_selection模块的train_test_split函数。这个函数用于将数据集分割成两部分:训练集和测试集。
X_train, X_test, y_train, y_test = train_test_split(train_data, train_target, test_size, random_state, shuffle)
变量 描述 X_train 划分的训练集数据 X_test 划分的测试集数据 y_train 划分的训练集标签 y_test 划分的测试集标签
参数 描述 train_data 还未划分的数据集 train_target 还未划分的标签 test_size 分割比例,默认为0.25,即测试集占完整数据集的比例 random_state 随机数种子,应用于分割前对数据的洗牌。可以是int,RandomState实例或None,默认值=None。设成定值意味着,对于同一个数据集,只有第一次运行是随机的,随后多次分割只要rondom_state相同,则划分结果也相同。 shuffle 是否在分割前对完整数据进行洗牌(打乱),默认为True,打乱
metrics
- metrics模块导入两个评估指标:mean_squared_error和 r2_score。mean_squared_error用于计算回归模型的均方误差(MSE),r2_score用于确定拟合优度,即模型对数据的解释程度。
csv
- CSV(Comma-Separated Values,逗号分隔的值)是一种简单、实用的文件格式,用于存储和表示包括文本、数值等各种类型的数据。CSV 文件通常以
.csv
作为文件扩展名。这种文件格式的一个显著特点是:文件内的数据以逗号,
分隔,呈现一个表格形式。CSV 文件已广泛应用于存储、传输和编辑数据。
第二步:调整数据
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)
'''
columns=boston.feature_names: 这里将列名称设置为数据集中特征的名称(比如 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 等等)。
'''
boston_df.head()
'''
boston_df.head()这行代码将会显示boston_df这个DataFrame的前五行。这是Pandas库中的一个方法,经常用来快速查看数据集的前几行以及确认数据的导入是否正确。
如果执行了上述代码,你会得到类似如下的输出:
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT
0 0.00632 18.0 2.31 0 0.538 6.575 65.2 4.0900 1 296.0 15.3 396.90 4.98
1 0.02731 0.0 7.07 0 0.469 6.421 78.9 4.9671 2 242.0 17.8 396.90 9.14
2 0.02729 0.0 7.07 0 0.469 7.185 61.1 4.9671 2 242.0 17.8 392.83 4.03
3 0.03237 0.0 2.18 0 0.458 6.998 45.8 6.0622 3 222.0 18.7 394.63 2.94
4 0.06905 0.0 2.18 0 0.458 7.147 54.2 6.0622 3 222.0 18.7 396.90 5.33
这个输出显示了 DataFrame的每一列及其相应的前五行数据。这些列代表了波士顿房价数据集中的特征,例如犯罪率(CRIM)、住宅用地超过25000平方英尺的比例(ZN)、商业用地的比例(INDUS)等。
'''
boston_df.info()
'''
boston_df.info() 是 Pandas 中用于获取关于数据集信息的方法。执行这行代码将会显示有关 boston_df 这个数据框的一些基本信息,包括每列的非空值数量、数据类型和内存使用情况等。
通常,info() 方法的输出结果如下所示:
列名(特征名称)
非空值数量
每列的数据类型
内存占用情况
这对于快速了解数据集中是否存在缺失值以及每列的数据类型非常有用。
'''
boston_df['PRICE'] = boston.target
DataFrame()
- 调用 Pandas 中的
DataFrame
构造函数来创建一个新的 DataFrame。
第三步:划分特征和目标变量
X = boston_df.drop('PRICE', axis=1)
y = boston_df['PRICE']
第四步: 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=100)
第五步:创建模型并拟合
# 创建线性回归模型
model = LinearRegression()
# 拟合模型
model.fit(X_train, y_train)
第六步:得出结果
y_pred = model.predict(X_test)
y_pred
第七步:整合结果
# 创建一个新的DataFrame,将实际值、预测值和特征合并在一起
results_df = X_test.copy()
results_df['Actual_Price'] = y_test
results_df['Predicted_Price'] = y_pred
第八步:评价
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
# 计算R-squared(决定系数)
r2 = r2_score(y_test, y_pred)