Правильный способ передачи столбца y в функции fit в scikit-узнайте

#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 массив.