Линейная регрессия на Pandas DataFrame с использованием Sklearn (IndexError: индекс кортежа вне диапазона)

Я новичок в Python и пытаюсь выполнить линейную регрессию с использованием sklearn на фреймворке pandas. Это то, что я сделал:

data = pd.read_csv('xxxx.csv')

После этого я получил DataFrame из двух столбцов, позвольте называть их 'c1', 'c2'. Теперь я хочу сделать линейную регрессию на множестве (c1, c2), поэтому я ввел

X=data['c1'].values
Y=data['c2'].values
linear_model.LinearRegression().fit(X,Y)

что привело к следующей ошибке

IndexError: tuple index out of range

Что здесь не так? Кроме того, я хотел бы знать

  • визуализировать результат
  • сделать прогнозы на основе результата?

Я искал и просматривал большое количество сайтов, но ни один из них, казалось, не инструктировал новичков о правильном синтаксисе. Возможно, то, что очевидно для экспертов, не так очевидно для начинающего, как я.

Вы можете помочь? Большое вам спасибо за ваше время.

PS: Я заметил, что большое количество начинающих вопросов было пропущено в stackoverflow. Пожалуйста, учтите тот факт, что вещи, которые кажутся очевидными для опытного пользователя, могут занять дни начинающих. Пожалуйста, используйте конфиденциальность при нажатии стрелки вниз, чтобы вы не навредили вибрации этого дискуссионного сообщества.

Ответ 1

Предположим, что ваш csv выглядит примерно так:

c1,c2
0.000000,0.968012
1.000000,2.712641
2.000000,11.958873
3.000000,10.889784
...

Я создал данные как таковые:

import numpy as np
from sklearn import datasets, linear_model
import matplotlib.pyplot as plt

length = 10
x = np.arange(length, dtype=float).reshape((length, 1))
y = x + (np.random.rand(length)*10).reshape((length, 1))

Эти данные сохраняются в test.csv(просто чтобы вы знали, откуда оно взялось, очевидно, вы будете использовать свои собственные).

data = pd.read_csv('test.csv', index_col=False, header=0)
x = data.c1.values
y = data.c2.values
print x # prints: [ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.]

Вам нужно взглянуть на форму данных, которые вы загружаете в .fit().

Здесь x.shape = (10,), но нам нужно, чтобы оно было (10, 1), см. sklearn. То же самое касается y. Итак, мы изменим форму:

x = x.reshape(length, 1)
y = y.reshape(length, 1)

Теперь мы создаем объект регрессии, а затем вызываем fit():

regr = linear_model.LinearRegression()
regr.fit(x, y)

# plot it as in the example at http://scikit-learn.org/
plt.scatter(x, y,  color='black')
plt.plot(x, regr.predict(x), color='blue', linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()

См. линейную регрессию sklearn example. enter image description here

Ответ 2

делать прогнозы на основе результата?

Чтобы предсказать,

lr = linear_model.LinearRegression().fit(X,Y)
lr.predict(X)

Можно ли просмотреть подробности регрессии?

Линейная регрессия имеет атрибуты coef_ и intercept_.

lr.coef_
lr.intercept_

показать наклон и перехват.

Ответ 3

Вам действительно нужно взглянуть на документы для метода fit, который вы можете просмотреть здесь

Для того, чтобы визуализировать линейную регрессию, играйте с примером здесь. Я предполагаю, что вы также не использовали ipython (теперь называемый jupyter), поэтому вам обязательно нужно потратить некоторое время на изучение этого. Это отличный инструмент для изучения данных и машинного обучения. Вы можете буквально скопировать/вставить пример из линейной регрессии scikit в блокнот ipython и запустить его

Для вашей конкретной проблемы с методом fit, обратившись к документам, вы можете видеть, что формат данных, которые вы передаете для значений X, неверен.

В документах, "X: массив numpy или разреженная матрица формы [n_samples, n_features]"

Вы можете исправить свой код с помощью этого

X = [[x] for x in data['c1'].values]

Ответ 4

Dataset

enter image description here

Импорт библиотек

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.linear_model import LinearRegression

Импорт набора данных

dataset = pd.read_csv('1.csv')
X = dataset[["mark1"]]
y = dataset[["mark2"]]

Подгонка простой линейной регрессии к набору

regressor = LinearRegression()
regressor.fit(X, y)

Прогнозирование результатов набора

y_pred = regressor.predict(X)

Визуализация результатов набора

plt.scatter(X, y, color = 'red')
plt.plot(X, regressor.predict(X), color = 'blue')
plt.title('mark1 vs mark2')
plt.xlabel('mark1')
plt.ylabel('mark2')
plt.show()

enter image description here

Ответ 5

Я публикую ответ, который касается именно той ошибки, которую вы получили:

IndexError: индекс кортежа вне диапазона

Scikit-Learn ожидает 2D входов. Просто измените X и Y.

Заменить:

X=data['c1'].values # this  has shape (XXX, ) - It 1D
Y=data['c2'].values # this  has shape (XXX, ) - It 1D
linear_model.LinearRegression().fit(X,Y)

с

X=data['c1'].values.reshape(-1,1) # this  has shape (XXX, 1) - it 2D
Y=data['c2'].values.reshape(-1,1) # this  has shape (XXX, 1) - it 2D
linear_model.LinearRegression().fit(X,Y)