Построение линейной регрессии из списка фреймов данных

#python #matplotlib #scikit-learn #linear-regression

#python #matplotlib #scikit-learn #линейная регрессия

Вопрос:

Я пытаюсь построить линейную регрессию приведенных ниже данных и у меня возникли проблемы с LinearRegression.fit() функцией sklearn, которая показывает эту ошибку: ValueError: Expected 2D array, got 1D array instead: . Я не уверен в том, как это сделать, и много изучил на этом форуме о том, как построить регрессию и извлечь фрейм данных из списка для анализа и построения графика. Я пытался преобразовать в np.reshape и преобразовать в array безрезультатно. Это даже не поместится (X, Y[0]).

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


colors = ['r','g','b','k', 'y', 'c', 'orange', 'm', 'darkviolet', 'lawngreen', 'firebrick']
dataset = pd.read_csv('data.csv', index_col=False)

# replace all instances of 'x' with blank
dataset = dataset.replace(to_replace='x', value='NaN') 

# get X, which is 1-10 in this case
X = dataset.iloc[:,0] 

# length of set X
lenX = float(len(X)) 

def get_Y(dataset, iterations):
    '''
    gets Y and the mean of each set of Y
    '''
    Y_list, Y_mean = [], []
    i = 1

    while i<(iterations 1): 
        Y = dataset.iloc[:,i]
        Y = pd.to_numeric(Y, errors='coerce') # change object dataframe to float64
        Y_list.append(Y) 
        Y_mean.append(Y.mean()) # get mean
        i  = 1
    return Y_list, Y_mean

Y, Y_mean = get_Y(dataset, lenX)

# plotting all 10 lines
for i in range(len(X)):
    plt.plot(X, Y[i], colors[i])

#newY = np.reshape(Y,100)
#newX = np.reshape(X,10)

LinearRegression().fit(newX,newY)
#reg.score(X,Y)

plt.legend(loc='best')
plt.show()
  

Это в data.csv:

 ,1,2,3,4,5,6,7,8,9,10
1,3.5,3.4,3.0,3.6,3.5,3.1,3.2,3.5,3.0,3.5
2,2.9,2.6,2.9,2.7,2.5,2.6,2.9,3.1,2.6,3.0
3,2.3,2.5,2.3,2.0,2.7,2.7,2.4,2.5,2.8,2.3
4,2.1,2.4,2.3,2.4,2.6,2.1,2.0,2.6,2.2,2.2
5,2.2,1.9,2.0,2.3,2.1,2.0,2.1,1.8,1.9,1.8
6,1.9,2.0,2.1,2.2,1.8,2.3,2.2,1.8,2.1,1.7
7,1.9,2.1,2.1,2.3,1.9,2.3,2.1,2.0,2.2,2.0
8,x,2.2,2.1,2.3,1.9,2.3,2.1,2.9,x,2.1
9,x,1.9,x,2.2,x,2.2,1.9,x,x,1.8
10,x,1.9,x,2.1,x,x,2.1,x,x,2.0
  

Построить график без регрессии.

Комментарии:

1. Каковы ваши функциональные и целевые столбцы? обычно последние столбцы являются целевыми, все предыдущие являются функциональными. Я также предполагаю, что первая строка и первые столбцы вашего csv-файла предназначены только для индексации, т. Е. не являются частью реального набора данных. Если это так, я считаю, что решение не будет сложным

2. @ShihabShahriar Спасибо за ваш ответ. Все они являются столбцами объектов. Первый столбец — это мой набор по оси X, первая строка — индексирование.

3. @ShihabShahriar Альтернативное решение, над которым я работаю, проще, чем иметь дело с несколькими фреймами данных в списке: я нашел среднее значение для каждой строки с помощью цикла while dataset.iloc[i-1, 1:] в get_Y . Теперь я построю график этого с помощью оси X, а затем найду линейную регрессию этого. Это устраняет любые ошибки построения графика фрейма данных и его зацикливания.

4. @ShihabShahriar Наконец-то мне удалось успешно построить свою линию 🙂