使用python+sklearn實現核嶺回歸與SVR的比較

2021-03-02 機器學習算法與知識圖譜
# 作者: Jan Hendrik Metzen <jhm@informatik.uni-bremen.de># 許可證: BSD 3 clause

import time
import numpy as np
from sklearn.svm import SVRfrom sklearn.model_selection import GridSearchCVfrom sklearn.model_selection import learning_curvefrom sklearn.kernel_ridge import KernelRidgeimport matplotlib.pyplot as plt
rng = np.random.RandomState(0)
# ############################################################################## 產生樣本數據X = 5 * rng.rand(10000, 1)y = np.sin(X).ravel()
# 把噪音添加到目標中y[::5] += 3 * (0.5 - rng.rand(X.shape[0] // 5))
X_plot = np.linspace(0, 5, 100000)[:, None]
# ############################################################################## 訓練回歸模型train_size = 100svr = GridSearchCV(SVR(kernel='rbf', gamma=0.1), param_grid={"C": [1e0, 1e1, 1e2, 1e3], "gamma": np.logspace(-2, 2, 5)})
kr = GridSearchCV(KernelRidge(kernel='rbf', gamma=0.1), param_grid={"alpha": [1e0, 0.1, 1e-2, 1e-3], "gamma": np.logspace(-2, 2, 5)})
t0 = time.time()svr.fit(X[:train_size], y[:train_size])svr_fit = time.time() - t0print("SVR complexity and bandwidth selected and model fitted in %.3f s" % svr_fit)
t0 = time.time()kr.fit(X[:train_size], y[:train_size])kr_fit = time.time() - t0print("KRR complexity and bandwidth selected and model fitted in %.3f s" % kr_fit)
sv_ratio = svr.best_estimator_.support_.shape[0] / train_sizeprint("Support vector ratio: %.3f" % sv_ratio)
t0 = time.time()y_svr = svr.predict(X_plot)svr_predict = time.time() - t0print("SVR prediction for %d inputs in %.3f s" % (X_plot.shape[0], svr_predict))
t0 = time.time()y_kr = kr.predict(X_plot)kr_predict = time.time() - t0print("KRR prediction for %d inputs in %.3f s" % (X_plot.shape[0], kr_predict))

# ############################################################################## 查看結果sv_ind = svr.best_estimator_.support_plt.scatter(X[sv_ind], y[sv_ind], c='r', s=50, label='SVR support vectors', zorder=2, edgecolors=(0, 0, 0))plt.scatter(X[:100], y[:100], c='k', label='data', zorder=1, edgecolors=(0, 0, 0))plt.plot(X_plot, y_svr, c='r', label='SVR (fit: %.3fs, predict: %.3fs)' % (svr_fit, svr_predict))plt.plot(X_plot, y_kr, c='g', label='KRR (fit: %.3fs, predict: %.3fs)' % (kr_fit, kr_predict))plt.xlabel('data')plt.ylabel('target')plt.title('SVR versus Kernel Ridge')plt.legend()
# 可視化訓練和預測的時間plt.figure()
# 產生樣本數據X = 5 * rng.rand(10000, 1)y = np.sin(X).ravel()y[::5] += 3 * (0.5 - rng.rand(X.shape[0] // 5))sizes = np.logspace(1, 4, 7).astype(np.int)for name, estimator in {"KRR": KernelRidge(kernel='rbf', alpha=0.1, gamma=10), "SVR": SVR(kernel='rbf', C=1e1, gamma=10)}.items(): train_time = [] test_time = [] for train_test_size in sizes: t0 = time.time() estimator.fit(X[:train_test_size], y[:train_test_size]) train_time.append(time.time() - t0)
t0 = time.time() estimator.predict(X_plot[:1000]) test_time.append(time.time() - t0)
plt.plot(sizes, train_time, 'o-', color="r" if name == "SVR" else "g", label="%s (train)" % name) plt.plot(sizes, test_time, 'o--', color="r" if name == "SVR" else "g", label="%s (test)" % name)
plt.xscale("log")plt.yscale("log")plt.xlabel("Train size")plt.ylabel("Time (seconds)")plt.title('Execution Time')plt.legend(loc="best")
# 可視化學習曲線plt.figure()
svr = SVR(kernel='rbf', C=1e1, gamma=0.1)kr = KernelRidge(kernel='rbf', alpha=0.1, gamma=0.1)train_sizes, train_scores_svr, test_scores_svr = \ learning_curve(svr, X[:100], y[:100], train_sizes=np.linspace(0.1, 1, 10), scoring="neg_mean_squared_error", cv=10)train_sizes_abs, train_scores_kr, test_scores_kr = \ learning_curve(kr, X[:100], y[:100], train_sizes=np.linspace(0.1, 1, 10), scoring="neg_mean_squared_error", cv=10)
plt.plot(train_sizes, -test_scores_svr.mean(1), 'o-', color="r", label="SVR")plt.plot(train_sizes, -test_scores_kr.mean(1), 'o-', color="g", label="KRR")plt.xlabel("Train size")plt.ylabel("Mean Squared Error")plt.title('Learning curves')plt.legend(loc="best")
plt.show()

相關焦點

  • 使用python+sklearn實現貝葉斯嶺回歸
    print(__doc__)import numpy as npimport matplotlib.pyplot as pltfrom scipy import statsfrom sklearn.linear_model
  • 使用python+sklearn實現高斯過程回歸
    本示例以兩種不同的方式來實現簡單的一維回歸:在這兩種情況下,
  • 使用python+sklearn實現線性回歸示例
    ‍本示例僅使用diabetes數據集的第一個特徵,以說明此回歸技術的二維的圖
  • 使用python+sklearn實現stacking方法來組合預測
    在本示例中,我們將不同的回歸器堆疊在一起,並使用最終的線性懲罰回歸器(inear penalized regressor)來預測輸出。我們將每個回歸器的性能與堆疊策略進行比較,結果顯示Stacking會稍微改善整體性能。
  • 使用python+sklearn實現自動關聯決策回歸
    用貝葉斯嶺回歸擬合回歸模型。
  • 使用python+sklearn實現處理缺失值
    缺失值可以使用提供的常量值進行插補,也可以使用缺失值所在的每一列的統計數據(平均值、中值或最頻繁值)。這個類還允許使用不同的缺失值編碼方法。missForest 目前是很受歡迎的,並且是不同序列插補算法的一個特殊實例,這些算法都可以使用IterativeImputer 來實現,通過傳遞不同的回歸器來預測缺失特徵值。在 missForest 的例子中,這個回歸器是一個隨機森林。請參見使用迭代插補器的變體插補缺失值。
  • 使用python+sklearn實現可視化
    在以下示例中,我們為已擬合的支持向量機繪製ROC曲線:from sklearn.model_selection import train_test_splitfrom sklearn.svm import SVCfrom sklearn.metrics import plot_roc_curvefrom sklearn.datasets
  • Python機器學習sklearn模塊-邏輯回歸
    邏輯回歸是屬於線性回歸模型的具體形式的另一種形式,但是是用來做分類任務的;分類任務的目標是找一個函數,把觀測值匹配到相關的類和標籤上
  • 使用python+sklearn實現隨機森林和多輸出元估計器的對比
    隨機森林和multioutput.MultiOutputRegressor多輸出回歸元估計器
  • 使用python+sklearn實現在各種小型數據集(toy datasets)上比較異常檢測算法
    alexandre.gramfort@inria.fr># Albert Thomas <albert.thomas@telecom-paristech.fr># 許可證: BSD 3 clauseimport timeimport numpy as npimport matplotlibimport matplotlib.pyplot as pltfrom sklearn
  • 使用python+sklearn實現可視化API繪製ROC曲線
    注意:單擊此處https://urlify.cn/rUJjUb下載完整的示例代碼,或通過Binder在瀏覽器中運行此示例Scikit-learn
  • 小白學數據:教你用Python實現簡單監督學習算法
    有很多方法可以實現有監督學習,我們將探討幾種最常用的方法。根據給定的數據集,機器學習可以分為兩大類:分類(Classification)和回歸(Regression)。如果給定的數據集的輸出值是類別,那麼待解決是分類問題。如果給定的數據集的輸出值是連續的,那麼該問題是回歸問題。舉兩個例子分類:判斷是貓還是狗。
  • Python+sklearn使用三種交叉驗證方法評估模型泛化能力
    :使用Python預處理機器學習需要的手寫體數字圖像文件數據集==============在使用機器學習算法時往往會使用sklearn.model_selection模塊中的函數train_test_split()把拿到的數據集劃分為訓練集和測試集,使用模型的fit()方法在訓練集上進行訓練,然後再使用模型的score()方法在測試集上進行評分。
  • 使用python+sklearn實現管道、Anova和SVM
    0.          0.          0.          0.          0.          0.  -0.04736524  0.          0.          0.          0.          0.
  • 特徵選擇及基於Sklearn的實現
    該方法比較簡單,易於運行和理解,通常對於理解數據有較好的效果,但對特徵優化、提高泛化能力來說效果不一定好。GenericUnivariateSelect使用可配置策略進行單變量特徵選擇,允許使用超參數搜索估計器選擇最佳的單變量選擇策略。
  • 實例應用(一): 數字識別使用OpenCV, sklearn和Python
    原文連結:http://hanzratech.in/2015/02/24/handwritten-digit-recognition-using-opencv-sklearn-and-python.html在我們開始之前,我將簡要列舉檢測手寫數字所需的步驟 -創建一個手寫數字的資料庫。
  • 使用python+sklearn實現排列重要性與隨機森林特徵重要性
    ‍在本示例中,我們使用permutation_importance和RandomForestClassifier比較在鐵達尼號數據集上基於雜質(impurity-based
  • Python+sklearn使用樸素貝葉斯算法識別中文垃圾郵件
    7、使用第5步中訓練好的模型,根據第6步提取的特徵向量對郵件進行分類。參考代碼:1、導入需要用到的標準庫和擴展庫對象。2、讀取全部訓練集,刪除幹擾字符或長度為1的單詞。Python題庫系列分享六(40道)1000道Python題庫系列分享七(30道)1000道Python題庫系列分享八(29道)1000道Python題庫系列分享九(31道)1000道Python題庫系列分享十(37道)1000道Python題庫系列分享十一(9道)相關閱讀Python+sklearn
  • 使用python+sklearn實現SGD: 加權樣本
    sphx_glr_plot_sgd_weighted_samples_001print(__doc__)import numpy as npimport matplotlib.pyplot as pltfrom sklearn import linear_model# 我們創建20個點np.random.seed(0)
  • 應用sklearn工具做線性回歸分析
    多元回歸的方程式為:Y=b0+b1X1+b2X2+…biXi#導入相關庫import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics