Линейная регрессия Sklearn – «IndexError: индекс кортежа вне диапазона»

У меня есть файл .dat, в котором хранятся значения X и Y (поэтому кортеж (n, 2), где n – количество строк).

import numpy as np import matplotlib.pyplot as plt import scipy.interpolate as interp from sklearn import linear_model in_file = open(path,"r") text = np.loadtxt(in_file) in_file.close() x = np.array(text[:,0]) y = np.array(text[:,1]) 

Я создал экземпляр для linear_model.LinearRegression() , но когда я .fit(x,y) метод .fit(x,y) я получаю

IndexError: индекс tuple выходит за пределы диапазона

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

Что я сделал не так?

Линейная регрессия ожидает, что X как массив с двумя измерениями и внутренне требует X.shape[1] для инициализации массива np.ones . Поэтому преобразование X в массив nx1 могло бы сделать трюк. Итак, замените:

 regr.fit(x,y) 

от:

 regr.fit(x[:,np.newaxis],y) 

Это устранит проблему. Демо-версия:

 >>> from sklearn import datasets >>> from sklearn import linear_model >>> clf = linear_model.LinearRegression() >>> iris=datasets.load_iris() >>> X=iris.data[:,3] >>> Y=iris.target >>> clf.fit(X,Y) # This will throw an error Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/dist-packages/sklearn/linear_model/base.py", line 363, in fit X, y, self.fit_intercept, self.normalize, self.copy_X) File "/usr/lib/python2.7/dist-packages/sklearn/linear_model/base.py", line 103, in center_data X_std = np.ones(X.shape[1]) IndexError: tuple index out of range >>> clf.fit(X[:,np.newaxis],Y) # This will work properly LinearRegression(copy_X=True, fit_intercept=True, normalize=False) 

Для построения линии регрессии используйте приведенный ниже код:

 >>> from matplotlib import pyplot as plt >>> plt.scatter(X, Y, color='red') <matplotlib.collections.PathCollection object at 0x7f76640e97d0> >>> plt.plot(X, clf.predict(X[:,np.newaxis]), color='blue') <matplotlib.lines.Line2D object at 0x7f7663f9eb90> >>> plt.show() 

введите описание изображения здесь