人工智能和机器学习之回归算法:支持向量回归(SVR):使用Python实现SVR算法_第1页
人工智能和机器学习之回归算法:支持向量回归(SVR):使用Python实现SVR算法_第2页
人工智能和机器学习之回归算法:支持向量回归(SVR):使用Python实现SVR算法_第3页
人工智能和机器学习之回归算法:支持向量回归(SVR):使用Python实现SVR算法_第4页
人工智能和机器学习之回归算法:支持向量回归(SVR):使用Python实现SVR算法_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

人工智能和机器学习之回归算法:支持向量回归(SVR):使用Python实现SVR算法1人工智能和机器学习之回归算法:支持向量回归(SVR)1.1简介1.1.1支持向量回归(SVR)概述支持向量回归(SupportVectorRegression,SVR)是支持向量机(SupportVectorMachine,SVM)在回归问题上的应用。SVM最初是为分类问题设计的,但通过一些调整,它同样可以应用于回归预测。SVR的核心思想是找到一个最优的边界,使得预测值与实际值之间的误差在一定范围内尽可能小,同时保持模型的复杂度最低。SVR使用了与SVM相同的核技巧,可以处理线性和非线性数据。它通过定义一个ε-insensitiveloss函数来实现这一点,该函数只对超过ε阈值的误差进行惩罚。这有助于模型忽略一些噪声数据,从而提高预测的准确性。1.1.2SVR与支持向量机(SVM)的关系SVR和SVM都基于统计学习理论和结构风险最小化原则。它们都试图找到一个超平面,但SVM用于分类,而SVR用于回归。在SVM中,超平面用于最大化不同类别之间的间隔;而在SVR中,超平面用于最小化预测值与实际值之间的误差。SVR和SVM都使用了支持向量的概念,即那些最接近决策边界的数据点。这些点对于定义模型至关重要,因为它们决定了模型的边界。在SVR中,支持向量是那些落在ε-insensitive带内的点,以及那些落在带外但距离带最近的点。1.2实现SVR算法1.2.1数据预处理在使用SVR之前,数据预处理是必不可少的步骤。这包括缩放数据,因为SVR对特征的尺度非常敏感。我们使用StandardScaler来标准化数据。#导入必要的库

importnumpyasnp

fromsklearn.preprocessingimportStandardScaler

fromsklearn.svmimportSVR

fromsklearn.model_selectionimporttrain_test_split

#创建数据集

X=np.array([[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]])

y=np.array([1.1,2.1,2.9,4.1,5.0,5.9,7.1,8.1,8.9,10.1])

#数据分割

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)

#数据缩放

sc_X=StandardScaler()

sc_y=StandardScaler()

X_train=sc_X.fit_transform(X_train)

y_train=sc_y.fit_transform(y_train.reshape(-1,1)).ravel()1.2.2模型训练接下来,我们使用SVR类来训练模型。这里我们选择RBF核函数,但也可以选择其他核函数,如linear、poly等。#创建SVR模型

svr=SVR(kernel='rbf',C=1e3,gamma=0.1)

#训练模型

svr.fit(X_train,y_train)1.2.3预测与评估模型训练完成后,我们可以使用测试集来评估模型的性能。#预测

y_pred=svr.predict(X_test)

y_pred=sc_y.inverse_transform(y_pred)

#评估

fromsklearn.metricsimportmean_squared_error,r2_score

mse=mean_squared_error(y_test,y_pred)

r2=r2_score(y_test,y_pred)

print("MeanSquaredError:",mse)

print("R2Score:",r2)1.2.4代码解释数据创建:我们创建了一个简单的数据集,其中X是输入特征,y是目标变量。数据分割:使用train_test_split函数将数据集分割为训练集和测试集。数据缩放:使用StandardScaler对X和y进行标准化处理,以避免特征尺度对模型的影响。模型创建与训练:使用SVR类创建模型,选择RBF核函数,并调整C和gamma参数。然后使用训练数据拟合模型。预测与评估:在测试集上进行预测,并使用mean_squared_error和r2_score来评估模型的性能。1.3结论通过上述步骤,我们已经成功地使用Python实现了支持向量回归(SVR)算法。SVR是一种强大的回归方法,尤其适用于非线性数据和高维空间。通过调整核函数和参数,可以优化模型的性能,使其在各种回归问题上都能表现出色。2理论基础2.1核函数的解释核函数在支持向量回归(SVR)中扮演着关键角色,它允许算法在高维空间中寻找非线性关系,从而提高模型的预测能力。核函数的基本思想是将低维空间中的非线性问题转换为高维空间中的线性问题。这通过映射原始特征到一个更高维度的空间来实现,使得在原空间中不可分的数据点在新空间中变得可分。2.1.1常见的核函数类型线性核函数:Kx多项式核函数:Kx,y=x高斯径向基函数(RBF):Kx,y2.1.2示例代码假设我们有以下数据集,我们将使用RBF核函数来拟合一个SVR模型。importnumpyasnp

fromsklearn.svmimportSVR

importmatplotlib.pyplotasplt

#生成数据

np.random.seed(0)

X=np.sort(5*np.random.rand(40,1),axis=0)

y=np.sin(X).ravel()

#添加噪声

y[::5]+=3*(0.5-np.random.rand(8))

#创建SVR模型

svr_rbf=SVR(kernel='rbf',C=1e3,gamma=0.1)

svr_rbf.fit(X,y)

#预测

X_plot=np.linspace(0,5,100)[:,None]

y_rbf=svr_rbf.predict(X_plot)

#绘制结果

plt.scatter(X,y,color='darkorange',label='data')

plt.plot(X_plot,y_rbf,color='navy',label='RBFmodel')

plt.xlabel('data')

plt.ylabel('target')

plt.title('SupportVectorRegression(SVR)')

plt.legend()

plt.show()2.1.3代码解释我们首先生成了一个包含40个数据点的简单数据集,其中数据点的x值是随机生成的,y值是x的正弦函数加上一些噪声。然后,我们创建了一个使用RBF核函数的SVR模型,并设置了惩罚参数C和γ。模型被训练后,我们使用它来预测一系列x值的y值,并将预测结果与原始数据点一起绘制出来,以可视化模型的拟合效果。2.2软间隔与惩罚参数C在支持向量回归中,软间隔的概念允许一些数据点在回归线上下一定范围内,而不被视为异常。这通过引入一个惩罚参数C来实现,C控制着模型对偏离回归线的数据点的容忍度。2.2.1参数的作用高C值:模型将更严格地惩罚偏离回归线的数据点,这可能导致模型过拟合。低C值:模型对偏离回归线的数据点的惩罚较轻,这有助于模型泛化,但可能降低模型的准确性。2.2.2示例代码我们将使用相同的正弦波数据集,但这次我们将比较不同C值下的SVR模型的性能。#创建不同C值的SVR模型

svr_rbf_lowC=SVR(kernel='rbf',C=1,gamma=0.1)

svr_rbf_highC=SVR(kernel='rbf',C=1e3,gamma=0.1)

#训练模型

svr_rbf_lowC.fit(X,y)

svr_rbf_highC.fit(X,y)

#预测

y_rbf_lowC=svr_rbf_lowC.predict(X_plot)

y_rbf_highC=svr_rbf_highC.predict(X_plot)

#绘制结果

plt.scatter(X,y,color='darkorange',label='data')

plt.plot(X_plot,y_rbf_lowC,color='red',label='RBFmodel(C=1)')

plt.plot(X_plot,y_rbf_highC,color='green',label='RBFmodel(C=1e3)')

plt.xlabel('data')

plt.ylabel('target')

plt.title('EffectofCinSVR')

plt.legend()

plt.show()2.2.3代码解释我们创建了两个SVR模型,一个使用较低的C值(1),另一个使用较高的C值(1e3)。模型训练后,我们预测了相同x值范围内的y值,并将两个模型的预测结果与原始数据点一起绘制出来。通过比较两个模型的预测曲线,我们可以观察到C值对模型拟合程度的影响。高C值的模型更紧密地跟随数据点,而低C值的模型则更平滑,对噪声的容忍度更高。通过这些示例,我们可以看到核函数和C参数在支持向量回归中的重要性,以及它们如何影响模型的性能和泛化能力。在实际应用中,选择合适的核函数和调整C参数是优化SVR模型的关键步骤。3数据预处理3.1特征缩放的重要性在机器学习中,特征缩放(FeatureScaling)是一个关键的预处理步骤,尤其对于依赖于距离或梯度下降算法的模型,如支持向量机(SVM)、K近邻(KNN)、逻辑回归等。特征缩放可以确保不同特征在数值上的差异不会对模型的性能产生不利影响。例如,如果一个特征的范围是0-1,而另一个特征的范围是1-1000,那么模型可能会过分重视范围较大的特征,即使它对预测结果的贡献并不比范围小的特征大。3.1.1为什么SVR需要特征缩放?支持向量回归(SVR)是支持向量机(SVM)在回归问题上的应用。SVR通过寻找一个最优的超平面来最小化预测值与实际值之间的误差。由于SVR的优化目标涉及到距离计算,如果特征尺度差异过大,将会影响模型的决策边界,导致模型性能下降。3.1.2特征缩放方法常见的特征缩放方法有两种:标准化(Standardization)和归一化(Normalization)。标准化:将特征转换为均值为0,标准差为1的分布。公式为:z,其中μ是特征的平均值,σ是特征的标准差。归一化:将特征转换为0-1之间的值。公式为:x,其中xmin3.1.3示例代码假设我们有一个数据集,其中包含两个特征:年龄和收入。年龄的范围是20-60,收入的范围是10000-100000。我们将使用Python的scikit-learn库进行特征缩放。importnumpyasnp

fromsklearn.preprocessingimportStandardScaler,MinMaxScaler

#示例数据

data=np.array([[20,10000],[30,20000],[40,30000],[50,40000],[60,50000]])

#标准化

scaler=StandardScaler()

data_scaled_std=scaler.fit_transform(data)

print("标准化后的数据:\n",data_scaled_std)

#归一化

scaler=MinMaxScaler()

data_scaled_minmax=scaler.fit_transform(data)

print("归一化后的数据:\n",data_scaled_minmax)3.2使用Python进行数据预处理在实际的机器学习项目中,数据预处理通常包括多个步骤,如缺失值处理、特征编码、特征缩放等。这里我们将重点介绍如何使用Python的scikit-learn库进行特征缩放。3.2.1缺失值处理在数据集中,缺失值是一个常见的问题。scikit-learn提供了SimpleImputer类来处理缺失值,可以使用均值、中位数或众数来填充缺失值。3.2.2特征编码对于分类特征,需要进行编码转换,使其可以被机器学习模型理解。scikit-learn提供了OneHotEncoder和LabelEncoder类来处理分类特征的编码。3.2.3示例代码:完整的数据预处理流程假设我们有一个包含年龄、收入和性别特征的数据集,其中性别是一个分类特征。我们将使用scikit-learn进行完整的数据预处理流程,包括缺失值处理、特征编码和特征缩放。importpandasaspd

fromsklearn.imputeimportSimpleImputer

fromsklearn.preprocessingimportOneHotEncoder,StandardScaler

fromposeimportColumnTransformer

fromsklearn.pipelineimportPipeline

#示例数据

data=pd.DataFrame({

'Age':[20,30,40,50,60,np.nan],

'Income':[10000,20000,30000,40000,50000,60000],

'Gender':['Male','Female','Male','Female','Male','Female']

})

#数据预处理

preprocessor=ColumnTransformer(

transformers=[

('num',Pipeline(steps=[

('imputer',SimpleImputer(strategy='mean')),

('scaler',StandardScaler())]),

['Age','Income']),

('cat',OneHotEncoder(),['Gender'])

])

data_preprocessed=preprocessor.fit_transform(data)

print("预处理后的数据:\n",data_preprocessed)在这个例子中,我们首先使用SimpleImputer处理年龄特征中的缺失值,然后使用StandardScaler进行特征缩放。对于分类特征性别,我们使用OneHotEncoder进行编码转换。通过ColumnTransformer和Pipeline,我们可以将这些预处理步骤组合在一起,形成一个完整的预处理流程。3.2.4结论特征缩放是机器学习中一个重要的预处理步骤,可以确保模型在处理不同尺度的特征时不会产生偏见。在使用Python进行数据预处理时,scikit-learn库提供了丰富的工具,可以方便地进行缺失值处理、特征编码和特征缩放等操作。通过上述示例代码,我们可以看到如何在实际项目中应用这些工具,以提高模型的性能和准确性。4模型构建4.1选择合适的核函数支持向量回归(SVR)是一种强大的机器学习技术,用于解决回归问题。它基于支持向量机(SVM)的原理,通过在高维空间中寻找最佳拟合超平面来预测连续值。核函数在SVR中扮演着关键角色,它允许模型处理非线性关系的数据。4.1.1原理核函数将输入数据从原始空间映射到一个更高维的空间,使得在原始空间中非线性的关系在高维空间中变得线性。常见的核函数包括线性核、多项式核、径向基函数(RBF)核和Sigmoid核。选择合适的核函数对于模型的性能至关重要。4.1.2示例代码假设我们有一组非线性分布的数据,我们将使用RBF核函数来构建SVR模型。importnumpyasnp

fromsklearn.svmimportSVR

fromsklearn.model_selectionimporttrain_test_split

importmatplotlib.pyplotasplt

#生成模拟数据

np.random.seed(0)

X=np.sort(5*np.random.rand(40,1),axis=0)

y=np.sin(X).ravel()

y[::5]+=3*(0.5-np.random.rand(8))

#划分数据集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#创建SVR模型,使用RBF核函数

svr_rbf=SVR(kernel='rbf',C=100,gamma=0.1,epsilon=.1)

svr_rbf.fit(X_train,y_train)

#预测

y_rbf=svr_rbf.predict(X_test)

#可视化结果

plt.scatter(X_train,y_train,color='darkorange',label='训练数据')

plt.scatter(X_test,y_test,color='red',label='测试数据')

plt.plot(X_test,y_rbf,color='navy',label='预测')

plt.xlabel('数据')

plt.ylabel('目标')

plt.title('使用RBF核函数的SVR')

plt.legend()

plt.show()4.1.3解释在这个例子中,我们首先生成了一组模拟数据,其中包含一些噪声。然后,我们使用train_test_split函数将数据划分为训练集和测试集。接下来,我们创建了一个SVR模型,指定使用RBF核函数,并设置了惩罚参数C、核函数参数gamma和损失函数的参数epsilon。模型训练后,我们使用测试集进行预测,并通过图表可视化了预测结果,可以看到模型很好地捕捉了数据的非线性趋势。4.2调整惩罚参数C和核函数参数gamma在构建SVR模型时,C和gamma是两个重要的超参数,它们对模型的性能有显著影响。4.2.1原理惩罚参数C:控制模型对错误的容忍度。较大的C值意味着模型对训练数据中的错误容忍度较低,可能会导致过拟合。核函数参数gamma:决定了核函数的宽度。较小的gamma值意味着核函数的宽度较大,模型将考虑更远的数据点;较大的gamma值意味着核函数的宽度较小,模型将更关注附近的点。4.2.2示例代码我们将使用GridSearchCV来寻找最佳的C和gamma值。fromsklearn.model_selectionimportGridSearchCV

#定义参数网格

param_grid={'C':[0.1,1,10,100],'gamma':[1,0.1,0.01,0.001],'kernel':['rbf']}

#创建SVR模型

svr=SVR()

#使用GridSearchCV进行参数搜索

grid=GridSearchCV(svr,param_grid,refit=True,verbose=2)

grid.fit(X_train,y_train)

#输出最佳参数

print("最佳参数:",grid.best_params_)

print("最佳分数:",grid.best_score_)

#使用最佳参数进行预测

y_pred=grid.predict(X_test)

#可视化结果

plt.scatter(X_train,y_train,color='darkorange',label='训练数据')

plt.scatter(X_test,y_test,color='red',label='测试数据')

plt.plot(X_test,y_pred,color='navy',label='预测')

plt.xlabel('数据')

plt.ylabel('目标')

plt.title('使用最佳C和gamma值的SVR')

plt.legend()

plt.show()4.2.3解释在这个例子中,我们定义了一个参数网格,包含了不同的C和gamma值。然后,我们使用GridSearchCV来遍历这些参数组合,寻找最佳的参数设置。GridSearchCV会自动训练模型并评估每个参数组合的性能,最后返回最佳的参数组合。我们使用这些最佳参数重新训练模型,并对测试集进行预测,最后通过图表展示了预测结果,可以看到调整后的模型性能更优。通过上述代码示例,我们可以看到如何在Python中使用sklearn库来构建和优化SVR模型,选择合适的核函数以及调整关键的超参数C和gamma,以获得更好的预测性能。5人工智能和机器学习之回归算法:支持向量回归(SVR)的Python实现5.1Python实现5.1.1subdir5.1:导入必要的库和数据集在开始支持向量回归(SVR)的实现之前,我们需要导入Python中的一些关键库,这些库将帮助我们处理数据、构建模型以及评估模型的性能。此外,我们还需要一个数据集来训练和测试我们的SVR模型。导入库#导入必要的库

importnumpyasnp

importpandasaspd

fromsklearn.svmimportSVR

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.preprocessingimportStandardScaler

importmatplotlib.pyplotasplt加载数据集假设我们有一个CSV文件data.csv,其中包含两列:X和y,分别代表特征和目标变量。#加载数据集

dataset=pd.read_csv('data.csv')

X=dataset.iloc[:,:-1].values

y=dataset.iloc[:,-1].values5.1.2subdir5.2:数据预处理与模型训练在进行模型训练之前,数据预处理是必不可少的步骤。这包括处理缺失值、编码分类数据、特征缩放等。对于SVR,特征缩放尤为重要,因为SVR对输入数据的尺度非常敏感。特征缩放#特征缩放

sc_X=StandardScaler()

sc_y=StandardScaler()

X=sc_X.fit_transform(X)

y=sc_y.fit_transform(y.reshape(-1,1)).ravel()划分数据集将数据集划分为训练集和测试集,以便我们可以在未见过的数据上评估模型的性能。#划分数据集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)训练SVR模型使用SVR类从sklearn.svm模块来训练模型。这里我们使用默认的核函数'rbf',但你可以根据数据的特性选择不同的核函数。#训练SVR模型

svr=SVR(kernel='rbf')

svr.fit(X_train,y_train)5.1.3subdir5.3:模型评估与结果可视化模型训练完成后,我们需要评估模型的性能,并通过可视化结果来更好地理解模型的预测能力。模型评估使用测试集来评估模型的性能,通常我们会计算模型的预测值与实际值之间的均方根误差(RMSE)。#模型评估

y_pred=svr.predict(X_test)

y_pred=sc_y.inverse_transform(y_pred.reshape(-1,1))

y_test=sc_y.inverse_transform(y_test.reshape(-1,1))

rmse=np.sqrt(np.mean((y_pred-y_test)**2))

print(f'RMSE:{rmse}')结果可视化使用matplotlib库来可视化模型的预测结果与实际结果之间的关系。#结果可视化

plt.scatter(X_test,y_test,color='red')

plt.plot(X_test,svr.predict(X_test),color='blue')

plt.title('SVR预测结果')

plt.xlabel('特征')

plt.ylabel('目标变量')

plt.show()通过上述步骤,我们已经完成了支持向量回归(SVR)模型的构建、训练、评估和可视化。在实际应用中,你可能需要根据具体问题调整模型参数,以获得最佳的预测性能。6案例分析6.1应用SVR预测房价支持向量回归(SVR)是一种基于支持向量机(SVM)的回归方法,它通过在高维空间中寻找一个最优的超平面来拟合数据,从而实现对连续值的预测。在本案例中,我们将使用Python的scikit-learn库来实现SVR算法,预测房价。6.1.1数据准备首先,我们需要一个房价数据集。这里我们使用一个虚构的数据集,包含房屋的特征(如面积、卧室数量等)和对应的价格。importnumpyasnp

importpandasaspd

#创建一个虚构的房价数据集

data={

'Area':[2000,1500,1000,3000,2500,1800,2200,2800,1200,1600],

'Bedrooms':[3,2,1,4,3,2,3,4,1,2],

'Price':[350000,200000,120000,500000,400000,250000,300000,450000,100000,180000]

}

df=pd.DataFrame(data)

X=df.iloc[:,:-1].values#特征

y=df.iloc[:,-1].values#目标变量6.1.2数据预处理在应用SVR之前,我们需要对数据进行预处理,包括特征缩放和处理缺失值。fromsklearn.preprocessingimportStandardScaler

#特征缩放

sc_X=StandardScaler()

sc_y=StandardScaler()

X=sc_X.fit_transform(X)

y=sc_y.fit_transform(y.reshape(-1,1)).ravel()#转换为一维数组6.1.3模型训练接下来,我们使用SVR模型进行训练。这里我们选择径向基函数(RBF)作为核函数。fromsklearn.svmimportSVR

#创建SVR模型

svr=SVR(kernel='rbf')

svr.fit(X,y)6.1.4模型预测使用训练好的模型对新的数据点进行预测。#预测房价

new_house=np.array([[2400,3]])#新房子的特征

new_house_scaled=sc_X.transform(new_house)

predicted_price_scaled=svr.predict(new_house_scaled)

predicted_price=sc_y.inverse_transform(predicted_price_scaled.reshape(-1,1))

print(f"预测的房价:{predicted_price[0][0]}")6.1.5模型评估评估模型的预测性能,通常使用均方根误差(RMSE)或决定系数(R^2)。fromsklearn.metricsimportmean_squared_error,r2_score

#预测所有数据点的价格

y_pred=svr.predict(X)

y_pred=sc_y.inverse_transform(y_pred.reshape(-1,1))

#计算RMSE和R^2

rmse=np.sqrt(mean_squared_error(y_true=y,y_pred=y_pred))

r2=r2_score(y_true=y,y_pred=y_pred)

print(f"RMSE:{rmse}")

print(f"R^2Score:{r2}")6.2分析SVR在不同核函数下的表现SVR的性能很大程度上取决于所选择的核函数。常见的核函数包括线性核、多项式核、Sigmoid核和RBF核。我们将比较这些核函数在相同数据集上的表现。6.2.1线性核函数#使用线性核函数的SVR

svr_linear=SVR(kernel='linear')

svr_linear.fit(X,y)

y_pred_linear=svr_linear.predict(X)

y_pred_linear=sc_y.inverse_transform(y_pred_linear.reshape(-1,1))

#计算RMSE和R^2

rmse_linear=np.sqrt(mean_squared_error(y_true=y,y_pred=y_pred_linear))

r2_linear=r2_score(y_true=y,y_pred=y_pred_linear)

print(f"线性核函数的RMSE:{rmse_linear}")

print(f"线性核函数的R^2Score:{r2_linear}")6.2.2多项式核函数#使用多项式核函数的SVR

svr_poly=SVR(kernel='poly',degree=3)

svr_poly.fit(X,y)

y_pred_poly=svr_poly.predict(X)

y_pred_poly=sc_y.inverse_transform(y_pred_poly.reshape(-1,1))

#计算RMSE和R^2

rmse_poly=np.sqrt(mean_squared_error(y_true=y,y_pred=y_pred_poly))

r2_poly=r2_score(y_true=y,y_pred=y_pred_poly)

print(f"多项式核函数的RMSE:{rmse_poly}")

print(f"多项式核函数的R^2Score:{r2_poly}")6.2.3Sigmoid核函数#使用Sigmoid核函数的SVR

svr_sigmoid=SVR(kernel='sigmoid')

svr_sigmoid.fit(X,y)

y_pred_sigmoid=svr_sigmoid.predict(X)

y_pred_sigmoid=sc_y.inverse_transform(y_pred_sigmoid.reshape(-1,1))

#计算RMSE和R^2

rmse_sigmoid=np.sqrt(mean_squared_error(y_true=y,y_pred=y_pred_sigmoid))

r2_sigmoid=r2_score(y_true=y,y_pred=y_pred_sigmoid)

print(f"Sigmoid核函数的RMSE:{rmse_sigmoid}")

print(f"Sigmoid核函数的R^2Score:{r2_sigmoid}")6.2.4RBF核函数#使用RBF核函数的SVR

svr_rbf=SVR(kernel='rbf')

svr_rbf.fit(X,y)

y_pred_rbf=svr_rbf.predict(X)

y_pred_rbf=sc_y.inverse_transform(y_pred_rbf.reshape(-1,1))

#计算RMSE和R^2

rmse_rbf=np.sqrt(mean_squared_error(y_true=y,y_pred=y_pred_rbf))

r2_rbf=r2_score(y_true=y,y_pred=y_pred_rbf)

print(f"RBF核函数的RMSE:{rmse_rbf}")

print(f"RBF核函数的R^2Score:{r2_rbf}")6.2.5结果比较通过比较不同核函数下的RMSE和R^2,我们可以评估哪种核函数在预测房价时表现最好。#比较结果

results={

'Linear':{'RMSE':rmse_linear,'R^2':r2_linear},

'Polynomial':{'RMSE':rmse_poly,'R^2':r2_poly},

'Sigmoid':{'RMSE':rmse_sigmoid,'R^2':r2_sigmoid},

'RBF':{'RMSE':rmse_rbf,'R^2':r2_rbf}

}

forkernel,metricsinresults.items():

print(f"{kernel}Kernel:RMSE={metrics['RMSE']:.2f},R^2={metrics['R^2']:.2f}")通过上述代码,我们可以直观地看到不同核函数对模型性能的影响,从而选择最适合当前问题的核函数。7进阶技巧7.1网格搜索优化参数网格搜索(GridSearch)是一种用于调优机器学习模型参数的方法,它通过构建一个参数的网格,然后在网格中的每个点上训练和评估模型,从而找到最佳的参数组合。在支持向量回归(SVR)中,网格搜索可以用于优化如C(惩罚参数)、gamma(核函数的系数)和kernel(核函数类型)等关键参数。7.1.1示例代码fromsklearn.model_selectionimportGridSearchCV

fromsklearn.svmimportSVR

fromsklearn.datasetsimportmake_regression

fromsklearn.model_selectionimporttrain_test_split

#生成回归数据集

X,y=make_regression(n_samples=1000,n_features=10,noise=0.1)

#划分训练集和测试集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#定义SVR模型

svr=SVR()

#定义参数网格

param_grid={

'C':[0.1,1,10,100],

'gamma':[1,0.1,0.01,0.001],

'kernel':['linear','rbf']

}

#创建网格搜索对象

grid_search=GridSearchCV(svr,param_grid,cv=5,scoring='neg_mean_squared_error')

#拟合数据

grid_search.fit(X_train,y_train)

#输出最佳参数

best_params=grid_search.best_params_

print("最佳参数:",best_params)

#使用最佳参数的模型进行预测

best_svr=grid_search.best_estimator_

predictions=best_svr.predict(X_test)

#评估模型

fromsklearn.metricsimportmean_squared_error

mse=mean_squared_error(y_test,predictions)

print("均方误差:",mse)7.1.2解释在上述代码中,我们首先生成了一个回归数据集,并将其划分为训练集和测试集。然后,我们定义了一个SVR模型和一个参数网格,其中包含我们想要优化的参数的不同值。通过GridSearchCV,我们执行了交叉验证,以在所有参数组合中找到表现最佳的模型。最后,我们使用找到的最佳参数对模型进行预测,并计算了均方误差(MSE)以评估模型的性能。7.2处理非线性可分数据的策略支持向量回归(SVR)在处理线性可分数据时效果很好,但现实世界中的许多数据集是非线性的。为了处理这类数据,SVR提供了几种策略,包括使用非线性核函数和特征工程。7.2.1非线性核函数非线性核函数如径向基函数(RBF)可以将数据映射到更高维度的空间,使得原本非线性可分的数据变得线性可分。7.2.2示例代码fromsklearn.svmimportSVR

fromsklearn.datasetsimportmake_regression

fromsklearn.model_selectionimporttrain_test_split

importnumpyasnp

#生成非线性可分数据

X,y=make_regression(n_samples=1000,n_features=10,noise=1.0,random_state=42)

y=np.sin(X[:,0])+np.random.normal(0,0.1,size=y.shape)

#划分训练集和测试集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#使用RBF核函数的SVR模型

svr_rbf=SVR(kernel='rbf')

#拟合数据

svr_rbf.fit(X_train,y_train)

#预测

predictions=svr_rbf.predict(X_test)

#评估模型

fromsklearn.metricsimportmean_squared_error

mse=mean_squared_error(y_test,predictions)

print("均方误差:",mse)7.2.3解释在这个例子中,我们生成了一个非线性可分的数据集,其中目标变量y是X的第一个特征的正弦函数加上一些随机噪声。我们使用了RBF核函数的SVR模型来拟合数据,RBF核函数能够处理非线性关系。通过在测试集上进行预测并计算MSE,我们可以评估模型在处理非线性数据时的性能。7.2.4特征工程特征工程是另一种处理非线性数据的策略,它涉及创建新的特征或转换现有特征,以帮助模型更好地捕捉数据中的模式。7.2.5示例代码fromsklearn.preprocessingimportPolynomialFeatures

fromsklearn.pipelineimportmake_pipeline

fromsklearn.svmimportSVR

fromsklearn.datasetsimportmake_regression

fromsklearn.model_selectionimporttrain_test_split

#生成非线性可分数据

X,y=make_regression(n_samples=1000,n_features=1,noise=1.0,random_state=42)

y=np.sin(X[:,0])+np.random.normal(0,0.1,size=y.shape)

#划分训练集和测试集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#使用多项式特征转换和线性核函数的SVR模型

svr_poly=make_pipeline(PolynomialFeatures(3),SVR(kernel='linear'))

#拟合数据

svr_poly.fit(X_train,y_train)

#预测

predictions=svr_poly.predict(X_test)

#评估模型

fromsklearn.metricsimportmean_squared_error

mse=mean_squared_error(y_test,predictions)

print("均方误差:",mse)7.2.6解释在这个例子中,我们使用了多项式特征转换来创建新的特征,这可以增加模型的复杂度,使其能够更好地拟合非线性数据。我们使用了线性核函数的SVR模型,因为特征转换已经将数据映射到了一个更高维度的线性可分空间。通过在测试集上进行预测并计算MSE,我们可以评估模型在处理非线性数据时的性能。通过网格搜索和使用非线性核函数或特征工程,我们可以显著提高支持向量回归(SVR)在复杂数据集上的性能。这些策略是机器学习模型调优的重要组成部分,能够帮助我们找到最佳的模型参数,从而提高预测的准确性。7.3总结与应用建议7.3.1SVR的优缺点总结支持向量回归(SupportVectorRegression,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论