Я только начал изучать полиномиальную регрессию. И я пытался создать график для полиномиальной регрессии, но он неправильный.
Мой код такой
#Linear regression
from sklearn import linear_model
clf = linear_model.LinearRegression()
x = data.loc[:, ['col1']]
y = data.loc[:, ['col2']]
clf.fit(x, y)
plt.scatter(x, y)
plt.plot(x, clf.predict(x))
plt.show()
Этот код предназначен для модели линейной регрессии, и график такой.
и код для полиномиальной регрессии здесь
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree=2)
poly_x = poly_reg.fit_transform(x)
clf.fit(poly_x, y)
plt.scatter(x, y)
plt.plot(x, clf.predict(poly_x))
Сюжет такой неправильный.
Я только начал узнавать об этом, и я просто пытался скопировать способ, которым делает какой-то учебник, поэтому мое понимание этого все еще плохо. Как я могу исправить этот сюжет, а также я был бы признателен за хорошие ресурсы для понимания концепции.
Вы имеете в виду sort_values по x?
Попробуйте использовать pipeline
, чтобы подогнать и предсказать
пример:
poly_model = make_pipeline(PolynomialFeatures(7),
LinearRegression())
rng = np.random.RandomState(1)
x = 10 * rng.rand(50)
y = np.sin(x) + 0.1 * rng.randn(50)
xfit = np.linspace(0, 10, 1000)
poly_model.fit(x.reshape(-1,1), y)
yfit = poly_model.predict(xfit.reshape(-1,1))
plt.scatter(x, y)
plt.plot(xfit, yfit)
из приведенного выше примера вы сможете понять, и очень важно использовать .reshape(-1,1)
, если у вас есть один столбец.
Посмотрим, поможет ли это вам понять ...
Извините, я не вижу, как ваш код может адаптироваться к моему коду. В чем проблема без переделки?
@dude Данные OP имеют правильную форму. В этом нет необходимости.
Извините, что означает OP? Также скажите, пожалуйста, в чем проблема с моим участком или мой путь?
Вам необходимо сначала отсортировать значения в X и y в соответствии со значениями в X.
# This is your data
x = data.loc[:, ['col1']]
y = data.loc[:, ['col2']]
# This is what you need to do.
# argsort() will return the indices of the sorting order
inds = x.values.ravel().argsort() # Here I am assuming that x has single feature
x = x.values.ravel()[inds].reshape(-1,1)
y = y.values[inds]
# Then continue your code.
poly_reg = PolynomialFeatures(degree=2)
poly_x = poly_reg.fit_transform(x)
clf.fit(poly_x, y)
plt.scatter(x, y)
plt.plot(x, clf.predict(poly_x))
plt.show()
Благодарим за уточнение ответа, но объект DataFrame не имеет атрибута ravel. Возникает ошибка. x имеет один столбец.
Я заменю фрейм данных на объект серии и попробую.
Теперь y = y [inds] эта строка вызывает ошибку. ... не в индексе 'Возможно, проблема в индексе x, а y не является числом
@dude Я отредактировал ответ. Я использовал .values
для преобразования фрейма данных в массив numpy. пожалуйста, проверьте
У объекта DataFrame нет атрибута ravel. Я снова скопировал ваш ответ, но эта ошибка возникает в inds = x.ravel (). Argsort ()
@dude Да, извините, пропустил эту строчку. Исправлено, теперь в него добавлен .values
. Пожалуйста, проверьте.
Большое спасибо, теперь правильный сюжет вышел. Я выясню, что ты сделал сейчас.
@dude Средние три строки - это то, что вам нужно. Я взял inds
, который отсортирует x
. Затем использовал то же самое на y
, чтобы y
был заказан так же, как и x
. Другие вещи, такие как ravel()
, values
и т. д., Используются только для извлечения массива numpy из фрейма данных.
Прошу прощения за последние вопросы. Означает ли эта сортировка сортировку по значению данных? Почему без сортировки сюжет получился запутанным?
@dude matplotlib
попытается соединить точки в соответствии с поставкой. Таким образом, когда он не отсортирован, он сначала присоединится к точке, которая может быть последней на графике, а затем снова перейдет к следующей точке, которая может быть внизу графика, затем к следующей точке, которая снова может быть с другой стороны и т. д.. Так что сюжет будет случайным. Я выполнил сортировку по значению данных, так что точки, предоставленные matplotlib при нанесении на график, находятся в порядке, так что когда он присоединяется к точке, он будет чистым
Позвольте нам продолжить обсуждение в чате.
Пожалуйста, отсортируйте данные X, а затем попробуйте