Векторная регрессия поддержки Scikit - проблема с эмуляцией кода с их сайта - PullRequest
0 голосов
/ 24 февраля 2019

, как следует из названия, я пытаюсь эмулировать несколько функций регрессии с сайта Scikit Learns (с моими собственными данными) и у меня возникают некоторые проблемы при построении моих результатов.

Код акции: https://scikit -learn.org / stable / auto_examples / svm / plot_svm_regression.html

Моя проблема: моя фигура строит несколько линий регрессии (см.цифры ниже).

In:  #select features
     feature_cols = ['avg_r']

     #x def
     X= df_s[feature_cols]
     X= df_s[['avg_r']]
     print("X type", type(X))
     print("X shape", X.shape)

     #y def
     y = df_s['sales']
     y = df_s.sales
     print("y type", type(y))
     print("y shape",y.shape)
Out: X type <class 'pandas.core.frame.DataFrame'>
     X shape (1105, 1)
     y type <class 'pandas.core.series.Series'>
     y shape (1105,)
In: X.head()
Out:     avg_r
0   470.500000
1   717.750000
2   603.416667
3   566.416667
4   778.333333
In: y.head()
Out: 0    2412
     1    1308
     2    2037
     3    2052
     4    1553
     Name: sales, dtype: int64
In: #split data into training and test subsets
    X_train, X_test, y_train, y_test = train_test_split(X,y)

    print("X_train", X_train.shape)
    print("X_test", X_test.shape)
    print("y_train", y_train.shape)
    print("y_train", y_test.shape)
Out: X_train (828, 1)
     X_test (277, 1)
     y_train (828,)
     y_train (277,)
In: #fit regression models

    svr_rbf = SVR(kernel='rbf', C=1e4, gamma=0.0025)
    svr_lin = SVR(kernel='linear', C=1e3)
    #svr_poly = SVR(kernel='poly', C=1e3, degree=2)

    y_rbf = svr_rbf.fit(X_train, y_train).predict(X_test)
    y_lin = svr_lin.fit(X_train, y_train).predict(X_test)
    #y_poly = svr_poly.fit(X_train, y_train).predict(X_test)
Out: blank
In: # Look at the results
    lw = 2
    plt.scatter(X_train, y_train, color='darkorange', label='sales')
    plt.plot(X_test, y_rbf, color='navy', lw=lw, label='RBF model')
    #plt.plot(X_test, y_lin, color='c', lw=lw, label='Linear model')
    #plt.plot(X_test.avg_r, y_poly, color='cornflowerblue', lw=lw, 
    label='Polynomial model')
    plt.xlabel('rank')
    plt.ylabel('sales')
    plt.title('Support Vector Regression')
    plt.legend()
    plt.show()
Out: 

enter image description here

Если я вместо этого построю график регрессий как разброс, я получу это:

In: # Look at the results
    lw = 2
    plt.scatter(X_train, y_train, color='darkorange', label='sales')
    plt.scatter(X_test, y_rbf, color='navy', lw=lw, label='RBF model')
    #plt.plot(X_test, y_lin, color='c', lw=lw, label='Linear model')
    #plt.plot(X_test.avg_r, y_poly, color='cornflowerblue', lw=lw, 
    label='Polynomial model')
    plt.xlabel('rank')
    plt.ylabel('sales')
    plt.title('Support Vector Regression')
    plt.legend()
    plt.show()
Out:

enter image description here

1 Ответ

0 голосов
/ 25 февраля 2019

Ваш код не производит "множественные линии регрессии".

Метод plt.plot(X,y) строит линии между каждой точкой ваших данных в том порядке, в котором вы их передали .Вот пример, который иллюстрирует, что происходит:

X = np.array([1,2,4,3])
y = np.array([0,0.5,2,1.5])

plt.plot(X,y)

Вы получите

unsorted plot

Однако, если вы сделаете это

X1 = X[np.argsort(X)]
y1 = y[np.argsort(X)]

plt.plot(X1,y1)

На этот раз вы получите

sorted plot

Так что все, что вам нужно сделать, это сделать то же самое исправление к своему коду:

X_test, y_rbf = X_test[np.argsort(X_test)], y_rbf[np.argsort(X_test)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...