2017-02-22 39 views
3

Об этом спросите о другом пакете в другом месте, но есть ли способ в Scikit. Учиться включать все переменные или все переменные минус определенное число, например, в R?Подгонка модели ко всем переменным в Python (Scikit Learn)

Чтобы привести пример того, что я имею в виду, скажем, у меня есть регрессия y = x1 + x2 + x3 + x4. В R я могу оценить эту регрессию, запустив:

result = lm(y ~ ., data=DF) 
summary(result) 

я бы себе представить, что есть подобный способ уплотнить формулы в Python, поскольку писать все переменные для больших наборов данных будет глупо.

+1

Я не верю, что это так, вот пример с sklearn [здесь] (http://scikit-learn.org/stable/auto_examples/linear_model /plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) – cdeterman

+0

@lmo Я отметил его как с тем, как я понял, что, вероятно, будет перекрытие между пользователями R и пользователями Scikit. – 114

+0

@ 114 с чем именно вы работаете? Можете ли вы привести пример с игрушкой? –

ответ

0

Мы можем попробовать следующий способ решения (давайте использовать iris набор данных и метку species как числовые и соответствовать моделям линейной регрессии, чтобы увидеть, как использовать все независимые предикторы как в R и python sklearn):

В R

summary(lm(as.numeric(Species)~., iris))[c('coefficients', 'r.squared')] 

$coefficients 
       Estimate Std. Error t value  Pr(>|t|) 
(Intercept) 1.18649525 0.20484104 5.792273 4.150495e-08 
Sepal.Length -0.11190585 0.05764674 -1.941235 5.416918e-02 
Sepal.Width -0.04007949 0.05968881 -0.671474 5.029869e-01 
Petal.Length 0.22864503 0.05685036 4.021874 9.255215e-05 
Petal.Width 0.60925205 0.09445750 6.450013 1.564180e-09 

$r.squared 
[1] 0.9303939 

В Python (sklearn с пастообразной)

from sklearn.datasets import load_iris 
import pandas as pd 
from patsy import dmatrices 

iris = load_iris() 
names = [f_name.replace(" ", "_").strip("_(cm)") for f_name in iris.feature_names] 
iris_df = pd.DataFrame(iris.data, columns=names) 
iris_df['species'] = iris.target 

# pasty does not support '.' at least in windows python 2.7, so here is the workaround 
y, X = dmatrices('species ~ ' + '+'.join(iris_df.columns - ['species']), 
        iris_df, return_type="dataframe") 

from sklearn.linear_model import LinearRegression 
model = LinearRegression() 
model.fit(X, y) 

print model.score(X,y) 
# 0.930422367533 

print model.intercept_, model.coef_ 
# [ 0.19208399] [[0.22700138 0.60989412 -0.10974146 -0.04424045]] 

Как мы можем видеть, модели, полученные в R и Python, с pasty аналогичны (порядок коэффициентов различен).

+1

'statsmodels' поддерживает' patsy' форум изначально ... можно было бы упомянуть ... http://statsmodels.sourceforge.net/0.6.0/examples/notebooks/generated/formulas.html –

1

Есть ли способ в Scikit Научиться включать все переменные или все переменные минус определенный номер?

Да, с sklearn + панд, чтобы соответствовать с использованием всех переменных, кроме одного, и использовать это один в качестве метки, вы можете сделать просто

model.fit(df.drop('y', axis=1), df['y']) 

И это будет работать для большинства sklearn моделей.

Это будет pandas + sklearn эквивалент R в ~ и - обозначений, если не используется pasty.

Чтобы исключить несколько переменных, вы можете сделать

df.drop(['v1', 'v2'], axis=1)