2016-11-16 3 views
1

Я пытаюсь подражать очень простой примерPyplot не может построить регрессию

N = 50 
x = np.random.rand(N) 
y = np.random.rand(N) 
colors = np.random.rand(N) 
area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radiuses 

print(type(x),type(y)) 
print('training samples ',len(x),len(y)) 
plt.scatter(x, y, c=colors, alpha=0.5) 
plt.show() 

это показывает

<class 'numpy.ndarray'> <class 'numpy.ndarray'> 
training samples 50 50 

как и ожидалось, и график показывает, как хорошо. Теперь я пытаюсь построить результаты GradientBoostingRegressor в

base_regressor = GradientBoostingRegressor() 
base_regressor.fit(X_train, y_train) 
y_pred_base = base_regressor.predict(X_test) 

print(type(X_train),type(y_train)) 
print('training samples ',len(X_train),len(y_train)) 
print(type(X_test),type(y_pred_base)) 
print('base samples ',len(X_test),len(y_pred_base)) 

plt.figure() 

plt.scatter(X_train, y_train, c="k", label="training samples") 
plt.plot(X_test, y_pred_base, c="g", label="n_estimators=1", linewidth=2) 
plt.xlabel("data") 
plt.ylabel("target") 
plt.title("Base Regression") 
plt.legend() 
plt.show() 

отметить, что X_train, y_train и X_test являются все Numpy массивы. Для приведенного выше кода я получаю

<class 'numpy.ndarray'> <class 'numpy.ndarray'> 
training samples 74067 74067 
<class 'numpy.ndarray'> <class 'numpy.ndarray'> 
base samples 166693 166693 

но сюжет не появляется, и я получаю ошибку

ValueError: x and y must be the same size 

на

plt.scatter(X_train, y_train, c="k", label="training samples") 

, но, как видно на выходе, x и y имеют одинаковый размер и тип. Что я делаю не так?

+5

вместо печати 'len (X_test)' вы могли бы напечатать 'X_test.shape'? – MMF

+0

спасибо за это, теперь я получаю «учебные образцы (74067, 163) (74067,)» и «базовые образцы» (166693, 163) (166693,) ' – AbtPst

+0

, что имеет смысл в отношении моего учебного измерения, у меня 163 столбца – AbtPst

ответ

3

Ваш массив X_train является 2-мерным, с 163 столбцами для каждого образца. Вы не можете построить массив y_train, который является только одномерным, против всего массива X_train. Аналогично для графика y_pred_base против X_test.

Вы должны выбрать один из столбцов в X массивов Заговор против, редактирования кода что-то вроде этого:

plt.scatter(X_train[:, 17], y_train, c="k", label="training samples") 
plt.plot(X_test[:, 17], y_pred_base, c="g", label="n_estimators=1", linewidth=2) 

зависимые переменные (X) живут в 163-мерном пространстве. Каждое значение y зависит от соответствующего значения x от каждого из этих измерений. Простой двухмерный разброс или линейный график просто не могут отображать всю эту информацию сразу.

Одна вещь, которую вы можете сделать, это выяснить, какая из переменных x зависит от ваших значений y. Вы можете получить к нему доступ с помощью атрибута base_regressor.feature_importances_. В документации есть here. Тогда вы можете сделать заговор против самых важных. Вы можете сделать это в нескольких измерениях с использованием графика 3D-разброса или даже в более высоких измерениях с чем-то вроде corner.py

+0

имеет смысл.Я все еще не понимаю, как добиться того, что я хочу видеть. в основном, я хочу сопоставить y с x для обучения данных, а затем сравнить их с другой диаграммой y против x для тестовых данных (после предсказания). Имеет ли это смысл? я просто хочу сравнить форму/распределение – AbtPst

+0

Я отредактировал свой ответ, чтобы включить объяснение, так как было слишком долго, чтобы вписаться в комментарий. Надеюсь, это поможет :) – kiliantics

Смежные вопросы