#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 Наконец-то мне удалось успешно построить свою линию 🙂