线性回归模型
1. 基本形式
通过属性的线性组合来进行预测的函数,向量形式记为 f ( x ) = w T x + b f(x)=w^{T}x+b f(x)=wTx+b其中w为属性的向量,b为常值。
2. 线性回归
属性转化->有序:连续;无序:向量。
最小二乘法(代数or分析证法)->
w
=
∑
i
=
1
m
y
i
(
x
i
−
x
ˉ
)
∑
i
=
1
m
x
i
2
−
1
m
(
∑
i
=
1
m
x
i
)
2
b
=
1
m
∑
i
=
1
m
(
y
i
−
w
x
i
)
w=\frac{\sum_{i=1}^{m}y_{i}(x_{i}-\bar{x})}{\sum_{i=1}^{m}x_{i}^{2}-\frac{1}{m}(\sum_{i=1}^{m}x_{i})^{2}}\\b=\frac{1}{m}\sum_{i=1}^{m}(y_{i}-wx_{i})
w=∑i=1mxi2−m1(∑i=1mxi)2∑i=1myi(xi−xˉ)b=m1i=1∑m(yi−wxi)多元:
w
^
=
(
A
T
A
)
−
1
A
T
y
\hat{w}=(A^{T}A)^{-1}A^{T}y
w^=(ATA)−1ATy,多组解:归纳偏好(如正则化项)。
其他:对数尺度:取对,线性化。
3. 对数几率回归
分类任务:将实值z转化为0/1值。
对数几率函数:单位阶跃函数的替代函数
y
=
1
1
+
e
−
z
y=\frac{1}{1+e^{-z}}
y=1+e−z1代入
z
=
e
−
(
w
T
x
+
b
)
z=e^{-(w^{T}x+b)}
z=e−(wTx+b)即可。
取y为样本x为正例的可能性,则y/(1+y)为正反可能性的比值,称odds(几率)。由上式有
ln
(
y
1
−
y
)
=
w
T
x
+
b
\ln(\frac{y}{1-y})=w^{T}x+b
ln(1−yy)=wTx+b。y->p(y=1|x).
给定数据集,最大化
l
(
w
,
b
)
=
∑
i
=
1
m
ln
(
p
(
y
i
∣
x
i
;
w
,
b
)
)
l(w,b)=\sum_{i=1}^{m}\ln(p(y_{i}|x_{i};w,b))
l(w,b)=i=1∑mln(p(yi∣xi;w,b))凸优化(如牛顿法迭代)->
β
∗
=
a
r
g
min
β
l
(
β
)
\beta^{\ast}=arg\min_{\beta}l(\beta)
β∗=argminβl(β)
4. 线性判别分析
LDA原理:给定直线,投影使得不同类别相距尽可能远。根据投影确定类别。
X
i
、
μ
i
、
Σ
i
X_{i}、\mu_{i}、\Sigma_{i}
Xi、μi、Σi分别表示第i类示例的集合、均值向量、协方差矩阵。投影->样本中心在直线上的投影分别为
w
T
μ
0
w_{T}\mu_{0}
wTμ0和
w
T
Σ
1
w
w_{T}\Sigma_{1}w
wTΣ1w,协方差
w
T
Σ
0
w
w_{T}\Sigma_{0}w
wTΣ0w和
w
T
Σ
1
w
w_{T}\Sigma_{1}w
wTΣ1w.
- 同类的协方差尽可能小,异类的协方差尽可能大: w T Σ 0 w + w T Σ 1 w w_{T}\Sigma_{0}w+w_{T}\Sigma_{1}w wTΣ0w+wTΣ1w尽可能小, ∣ ∣ w T μ 0 − w T μ 1 ∣ ∣ 2 2 ||w_{T}\mu_{0}-w_{T}\mu_{1}||_{2}^{2} ∣∣wTμ0−wTμ1∣∣22尽可能大。二者作差记为J,为最大化目标。
- 类内散度矩阵
S
w
=
Σ
0
+
Σ
1
=
∑
x
ϵ
X
0
(
x
−
μ
0
)
(
x
−
μ
0
)
T
+
∑
x
ϵ
X
1
(
x
−
μ
1
)
(
x
−
μ
1
)
T
S_{w}=\Sigma_{0}+\Sigma_{1}=\sum_{x\epsilon X_{0}}(x-\mu_{0})(x-\mu_{0})^{T}+\sum_{x\epsilon X_{1}}(x-\mu_{1})(x-\mu_{1})^{T}
Sw=Σ0+Σ1=∑xϵX0(x−μ0)(x−μ0)T+∑xϵX1(x−μ1)(x−μ1)T
类间散度矩阵 S b = ( μ 0 − μ 1 ) ( μ 0 − μ 1 ) T S_{b}=(\mu_{0}-\mu_{1})(\mu_{0}-\mu_{1})^{T} Sb=(μ0−μ1)(μ0−μ1)T - 则最大化目标: J = w T S b w w T S w w J=\frac{w_{T}S_{b}w}{w_{T}S_{w}w} J=wTSwwwTSbw,称广义瑞利商。
- 拉格朗日乘子法->
w
=
S
w
−
1
(
μ
0
−
μ
1
)
w=S_{w}^{-1}(\mu_{0}-\mu_{1})
w=Sw−1(μ0−μ1)。实践中常用广义逆(奇异值分解)。
贝叶斯决策理论解释。
5. 多分类学习
拆解法:把多分类任务拆解为若干个二分类任务求解,再对多个分类器集成。
拆分策略:一对一(OvO)、一对多(OvR)、多对多(MvM).
- OvO:N个类别两两配对,投票决定最终分类结果。训练时间少,测试时间长。
- OvR:每一个类的样例作为正例、所有其他类作为反例训练N个分类器。测试时只有一个分类器预测为正类则为最终结果;若有多个分类器预测为正类,选择置信度最高的类别标记作为分类结果。训练时间长,测试时间短。
- MvM:若干正,若干反。
纠错输出码(ECOC):1. 编码:对N个类别做M次划分,训练M个分类器。2. 解码:M个分类器分别对测试样本进行预测,预测标记组成一个编码。将这个预测编码与类别各自编码比较,返回其中距离最小的类别作为最终预测结果。
类别划分通过编码矩阵指定,常见的有二元码、三元码。
6. 类别不平衡问题
指分类任务中不同类别的训练样例数目差别很大的情况。
- 再缩放rescaling:正例m+,反例m-,则 若 y 1 − y > m + m − ,则预测为正例。 若\frac{y}{1-y}>\frac{m^{+}}{m^{-}},则预测为正例。 若1−yy>m−m+,则预测为正例。则在分类器决策前缩放,令 y ′ 1 − y ′ = y 1 − y × m − m + \frac{y'}{1-y'}=\frac{y}{1-y}\times \frac{m^{-}}{m^{+}} 1−y′y′=1−yy×m+m−.
- 欠采样:去除一些使得正、反例数目相近。
- 过采样:增加一些使得正、反例数目相近。
- 用上述缩放进行阈值移动。
import pandas as pd
import numpy as np
from scipy import stats
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 设置文件路径
file_path = '棉花产量论文作业的数据.csv'
# 使用 pandas 的 read_csv 函数读取 CSV 文件,注意查看csv文件的编码,默认不填为utf-8编码
data = pd.read_csv(file_path, encoding='gbk')
# 显示数据的前几行来验证读取是否成功
print(data.head())
# 数据预处理,观察是否有缺失值
print(data.isnull().any())
# 删除包含缺失值的行
data = data.dropna()
# 数据预处理,看是否异常
# X要素是种子费、化肥费、农药费、机械费、灌溉费
X = data.iloc[:, 2:]
# Y要素是单产
Y = data.iloc[:, 1]
print(X)
print(Y)
# 划分数据集并训练模型
# 将数据分为训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X_train, Y_train)
# 预测测试集的结果
Y_pred = model.predict(X_test)
# 评估模型
mse = mean_squared_error(Y_test, Y_pred)
r2 = r2_score(Y_test, Y_pred)
print("Mean Squared Error:", mse)
print("R2 Score:", r2)
# 通过模型的系数和截距来查看每个X要素对Y的影响
print("Coefficients:", model.coef_)
print("Intercept:", model.intercept_)
# 计算相关系数矩阵,如果两个变量之间的相关系数接近1或-1,则表明它们之间存在高度线性关系。
correlation_matrix = X.corr()
print(correlation_matrix)
from statsmodels.stats.outliers_influence import variance_inflation_factor
# 分类数据使用独热编码
# data['Gender'] = data['Gender'].map({'Male':0, 'Female':1})
# the independent variables set
X1 = data[['种子费', '化肥费', '农药费', '机械费', '灌溉费']]
# 计算VIF
vif_data = pd.DataFrame()
vif_data["feature"] = X1.columns
vif_data["VIF"] = [variance_inflation_factor(X1.values, i) for i in range(X1.shape[1])]
print(vif_data)
一些运行结果:
相关系数矩阵 / 方差膨胀因子