Вопрос или проблема
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.metrics import r2_score
# загрузка данных
veriler = pd.read_csv(r'C:\Users\k\Desktop\maaslar_yeni.csv')
# x здесь независимая переменная, y же является зависимой переменной.
x = veriler.iloc[:,2:3]
y = veriler.iloc[:,5:]
X=x.values.reshape(-1,1)
Y=y.values.reshape(-1,1)
# линейная регрессия
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X,Y)
import statsmodels.api as sm
model=sm.OLS(lin_reg.predict(X),X)
print(model.fit().summary())
На уроке инструктор просто изменил x, создав новые X и Y. Затем он пытается использовать LinearRegression, как вы видите на картинке, чтобы узнать значение R. Но когда я пытаюсь это сделать, я вижу указанную ошибку. Как я могу это исправить?
Ваш код может содержать ошибку
x = veriler.iloc[:,2:3]
y = veriler.iloc[:,5:]
X=x.values.reshape(-1,1)
Y=y.values.reshape(-1,1)
Как вы можете видеть, у x есть ОДНА колонка (2:3), но у y может быть больше одной (5: означает 6-й столбец до конца). В результате, когда вы выполняете reshape, длина Y может быть в два (или более) раза больше, чем длина X.
Пожалуйста, приведите несколько записей ваших данных, чтобы помочь вам больше; но вообще, X может иметь несколько колонок, а Y — одну колонку. Однако, если вы собираетесь делать регрессию для 1 колонки X и Y, возможное исправление вашего кода выглядит так (уберите : для вашего y)
y = veriler.iloc[:,5]
Ответ или решение
Ошибка "Expected 2D array, got scalar array instead: array=11" часто возникает в контексте работы с библиотеками для машинного обучения, такими как scikit-learn
, и может быть связана с тем, что ожидались данные в двумерном формате, тогда как на самом деле был передан скаляр или одномерный массив. В данной ситуации данная ошибка может быть вызвана некорректным определением массивов X
и Y
.
Рассмотрим вашу кодовую базу более подробно и выявим возможные проблемы, которые могут привести к данной ошибке.
Анализ кода
-
Импорт необходимых библиотек:
Код начинается с импорта необходимых модулей, таких какnumpy
,pandas
,matplotlib
иsklearn
, что является стандартной практикой для работы с данными и машинным обучением. -
Загрузка данных:
veriler = pd.read_csv(r'C:\Users\k\Desktop\maaslar_yeni.csv')
Здесь вы загружаете данные из CSV-файла в DataFrame
pandas
. Убедитесь, что файл существует по указанному пути и данные корректно загружены. -
Определение независимой и зависимой переменной:
x = veriler.iloc[:,2:3] # Независимая переменная y = veriler.iloc[:,5:] # Зависимая переменная
В этом коде вы извлекаете независимые и зависимые переменные. Важно заметить, что
x
будет являться одной колонкой, тогда какy
может содержать несколько колонок, если в вашем наборе данных больше одной зависимой переменной, что потенциально вызывает несоответствие в размерах. -
Преобразование в массивы и изменение формы:
X = x.values.reshape(-1, 1) # Преобразование x в двумерный массив Y = y.values.reshape(-1, 1) # Преобразование y в двумерный массив
Использование метода
reshape(-1, 1)
здесь создает двумерные массивы. Однако, еслиy
содержит более одной колонки, и если размерыX
иY
не совпадают, это приведет к ошибке при попытке выполнения регрессии.
Решение проблемы
Для устранения данной проблемы рекомендуется изменить определение y
, чтобы извлечь только одну колонку. Это можно сделать следующим образом:
y = veriler.iloc[:, 5] # Извлечение одной колонки
Таким образом y
станет одномерным массивом, и в дальнейшем изменения не потребуются, так как y
будет совместим с методом регрессии scikit-learn
.
Обновленный код
Вот ваша обновленная часть кода с исправлениями:
# Определение зависимой переменной
y = veriler.iloc[:, 5] # Извлечение только одной колонки
# Преобразование в массивы
X = x.values.reshape(-1, 1)
Y = y.values.reshape(-1, 1)
Заключение
После внесения указанных изменений ошибка "Expected 2D array, got scalar array instead" должна исчезнуть. Следует также удостовериться, что форма массивов X
и Y
совпадает перед вызовом метода fit
модели линейной регрессии. Проверяйте размерности массивов с помощью print(X.shape, Y.shape)
, чтобы убедиться, что они соответствуют друг другу.
Если ошибка возникает снова, проверьте целостность и структуру данных в вашем CSV-файле.