2014-08-31 22 views
5

Khi đào tạo hồi quy SVM, bạn nên cân nhắc các tính năng đầu vào trước khi đào tạo.Mở rộng quy mô của các nguyên nhân mục tiêu Scikit-tìm hiểu hồi quy SVM để chia nhỏ

Nhưng làm cách nào để mở rộng quy mô mục tiêu? Thông thường điều này không được coi là cần thiết, và tôi không thấy lý do chính đáng tại sao nó cần thiết.

Tuy nhiên trong scikit-học ví dụ cho SVM hồi quy từ: http://scikit-learn.org/stable/auto_examples/svm/plot_svm_regression.html

Bởi chỉ cần giới thiệu dòng y = y/1000 trước khi đào tạo, dự đoán sẽ phá vỡ xuống đến một giá trị không đổi. Chia tỷ lệ biến mục tiêu trước khi đào tạo sẽ giải quyết được vấn đề, nhưng tôi không hiểu tại sao nó lại cần thiết.

Điều gì gây ra sự cố này?

import numpy as np 
from sklearn.svm import SVR 
import matplotlib.pyplot as plt 

# Generate sample data 
X = np.sort(5 * np.random.rand(40, 1), axis=0) 
y = np.sin(X).ravel() 

# Add noise to targets 
y[::5] += 3 * (0.5 - np.random.rand(8)) 

# Added line: this will make the prediction break down 
y=y/1000 

# Fit regression model 
svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1) 
svr_lin = SVR(kernel='linear', C=1e3) 
svr_poly = SVR(kernel='poly', C=1e3, degree=2) 
y_rbf = svr_rbf.fit(X, y).predict(X) 
y_lin = svr_lin.fit(X, y).predict(X) 
y_poly = svr_poly.fit(X, y).predict(X) 

# look at the results 
plt.scatter(X, y, c='k', label='data') 
plt.hold('on') 
plt.plot(X, y_rbf, c='g', label='RBF model') 
plt.plot(X, y_lin, c='r', label='Linear model') 
plt.plot(X, y_poly, c='b', label='Polynomial model') 
plt.xlabel('data') 
plt.ylabel('target') 
plt.title('Support Vector Regression') 
plt.legend() 
plt.show() 

Trả lời

7

Hồi quy vector hỗ trợ sử dụng hàm mất chỉ tích cực nếu chênh lệch giữa giá trị được dự đoán và mục tiêu vượt quá một số ngưỡng. Dưới ngưỡng này, dự đoán được coi là "đủ tốt" và mức thua lỗ bằng không. Khi bạn giảm tỷ lệ các mục tiêu, người học SVM có thể lấy đi bằng cách trả lại một mô hình phẳng, bởi vì nó không còn chịu bất kỳ tổn thất nào nữa.

Thông số ngưỡng được gọi là epsilon trong sklearn.svm.SVR; đặt giá trị thấp hơn cho các mục tiêu nhỏ hơn. Toán học đằng sau điều này được giải thích here.

+0

Đó là nó, cảm ơn bạn đã trả lời. Vì vậy, đối với một mô hình chung, các tùy chọn là để mở rộng mục tiêu, hoặc để bao gồm epsilon trong tìm kiếm lưới của tôi. Bạn có lời khuyên nào có ý nghĩa hơn không? – user1774143

+1

@ user1774143 Tìm kiếm lưới cho đúng 'epsilon'. Chia tỷ lệ 'y' là tương đương, nhưng dễ bị lỗi. –

Các vấn đề liên quan