#python #python-3.x #scikit-learn
Вопрос:
Мне было интересно, как правильно передавать столбцы в функции соответствия. Например, у меня есть:
# Lin. regression
lin_reg = LinearRegression().fit(data[["X"]],
data[["Y"]])
#Poisson regression
log_reg = PoissonRegressor().fit(data[["X"]],
data.loc[:, "Y"])
Таким образом, в линейной регрессии линии, представленные выше, просто работают, даже если я передаю столбец y как data[["Y"]]
. Если бы я сделал это в регрессии Пуассона (например, см. Ниже).
log_reg = PoissonRegressor().fit(data[["X"]],
data[["Y"]])
Это выдало бы предупреждение: «Вектор-столбец y был передан, когда ожидался массив 1d. Пожалуйста, измените форму y на (n_samples,), например, с помощью функции ravel().».
Теперь я хотел бы знать, как правильно передавать значение y в scikit-learn и как получается, что линейная регрессия не вызывает никаких проблем.
Я полностью осознаю, что data[["Y"]]
это приводит к кадру данных, поэтому я предполагаю, что в этом разница, но я не уверен, почему линейная регрессия примет кадр данных, в то время как регрессия Пуассона этого не делает.
Поэтому, как правильно передать значение y в scikit, узнайте.
Ответ №1:
Правильный способ передачи y
-передать массив, подобный указанной форме соответствующего метода. Поэтому вам нужно знать две вещи:
1) Что такое массивоподобный?
Ссылку на то, что представляет собой массив, можно найти здесь. Любой из указанных там объектов допустим и может быть использован. Я считаю, что особых предпочтений нет, так как scikit-learn
они все равно будут внутренне преобразованы в numpy
массивы.
2) Какая форма требуется?
Используя ваши примеры, вы увидите, что fit
методы LinearRegression
и PoissonRegressor
будут принимать разные формы.
Здесь для LinearRegression
:
y: массив, подобный форме (n_samples,) или (n_samples, n_targets)
И вот для PoissonRegressor
:
y: массив, подобный форме (n_samples,)
Поскольку LinearRegression
поддерживает многовходовую регрессию, он принимает массив, подобный форме (n_samples, n_targets)
, который также может быть (n_samples, 1)
похож на ваш случай. Так что никаких проблем нет.
PoissonRegressor
с другой стороны, допускает только формы (n_samples,)
. Вот почему он жалуется, что ваш ввод не соответствует спецификациям.
Однако обратите внимание, что он все еще работает, так как может преобразовывать данные в указанную форму. Но вы получаете предупреждение, чтобы знать, что здесь должны использоваться только массивы 1d, поскольку нет поддержки (потенциального) многовыхода.
Если вы хотите избежать каких-либо проблем, следуйте инструкциям в сообщении об ошибке и используйте ravel
для выравнивания ввода. Например, в вашем случае:
log_reg = PoissonRegressor().fit(data[["X"]],
data[["Y"]].values.ravel())
values
возвращает соответствующий numpy
массив и ravel
преобразует его в 1d массив.