1、支持向量回归(SVR)原理
支持向量回归(Support Vector Regression,SVR)不仅可以用于预测,还可以用于异常值检测。其基本思路是训练一个回归模型,通过对每个数据点进行预测,并计算其预测残差,来判断该数据点是否为异常值。
在SVR中,我们通过最大化预测出错的容忍度(margin)来寻找最优解。具体地,我们希望找到一个超平面,使得所有数据点到该超平面的距离都大于等于一定的阈值(margin)。对于线性回归模型,该超平面为:
w^T * x + b = 0
其中,w
是超平面法向量,b
是偏置项,x
是输入数据。对于一个输入数据x_i
,其距离超平面的距离为:
y_pred_i - y_i = (w^T * x_i + b) - y_i
其中,y_pred_i
是该数据点的预测值,y_i
是该数据点的真实值。我们定义预测残差为绝对值:
r_i = abs(y_pred_i - y_i)
那么,如果某个数据点的预测残差(r_i
)大于某个阈值,则被视为异常值,否则视为正常值。
在实际操作中,我们需要指定SVR的一些超参数,例如核函数类型、核函数参数、惩罚系数等。这些超参数对于SVR的性能有很大的影响,需要根据具体问题进行调整。
2、关键函数svr.fit函数参数
sklearn.svm.SVR
中fit
函数常用参数如下:
X
: 训练数据X,必选参数,形状为(n_samples, n_features)。y
: 目标值y,必选参数,形状为(n_samples,)。sample_weight
: 样本权重,可选参数,形状为(n_samples,),默认每个样本的权重相等。C
: 惩罚系数,可选参数,默认为1.0,一般取值为(0, +∞)之间的数。C越小,模型越简单;C越大,模型越复杂。调整C的值可以防止过拟合或欠拟合的问题。kernel
: 核函数,可选参数,默认为’rbf’,表示高斯核函数。常用的核函数还有’linear’线性核函数、'poly’多项式核函数、‘sigmoid’ Sigmoid核函数。核函数的选择决定了模型的复杂度和拟合能力。degree
: 多项式核函数的次数,可选参数,默认为3。gamma
: 核函数系数,可选参数,默认为’scale’,表示使用1 / (n_features * X.var())作为gamma值。也可以设置为’auto’或一个数值。coef0
: 核函数的截距,可选参数,默认为0。epsilon
: SVR中的ε,可选参数,默认为0.1。控制了对误差的容忍度。如果预测值与真实值的差小于ε,该点就被视为预测正确。shrinking
: 是否使用启发式(Hearst)方法来加速计算,可选参数,默认为True。建议保持默认值。tol
: 迭代终止条件,可选参数,默认为1e-3。如果模型收敛后两次迭代的损失函数之差小于该值,则终止训练。max_iter
: 最大迭代次数,可选参数,默认为-1,表示没有限制。如果收敛前达到该值,则提前终止训练。cache_size
: 核函数缓存大小,可选参数,默认为200MB。
需要根据具体的情况,调整SVR的超参数以获得更好的性能和效果。
3、完整代码
import pandas as pd
from sklearn.svm import SVR
# 加载数据
data = pd.read_csv('data.csv')
# 训练SVR模型
X = data.index.values.reshape(-1, 1)
y = data['value'].values.reshape(-1, 1)
svr = SVR(kernel='rbf', gamma='scale', C=1.0, epsilon=0.1)
svr.fit(X, y)
# 计算每个数据点的预测偏差
y_pred = svr.predict(X)
residuals = abs(y - y_pred)
# 计算偏差的标准差
std_dev = residuals.std()
# 计算阈值
threshold = 3 * std_dev
# 找到异常值
mask = (residuals <= threshold).flatten()
clean_data = data.loc[mask]
# 输出结果
print(clean_data)
测试报错:
Reshape your data either using array.reshape(-1, 1) 。
dataframe数据需要转换为array。
经测试:
X = df['X'].values.reshape(-1, 1)
y = np.array(df['y'])
测试结果: