почему иногда изменяют форму (-1,1), а иногда нет в моделях машинного обучения? - PullRequest
0 голосов
/ 27 сентября 2019

При назначении массивов X и Y в модели машинного обучения я вижу, что они иногда получают столбец из кадра данных со «значениями», как в df.iloc [:, 2] .values ​​, ииногда преобразовывая его в 2D-массив, как в df.iloc [:, 2] .values.reshape (-1,1) .

, когда использовать который?

и иногда я использую в любом случае, и они оба работают.почему работает не сформированный, в то время как существует утверждение типа «Преобразователи scikit-learn ожидают, что входные данные будут матрицами строк и столбцов, поэтому 1D-массивы для целевой переменной должны быть преобразованы в 2D-массивы до преобразований."

РЕДАКТИРОВАТЬ:

X=dataset.iloc[:,1:23].values
y=dataset.iloc[:,0].values

#%%
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
lr_X=LabelEncoder()
for i in range(0,22):
    X[:,i]=lr_X.fit_transform(X[:,i])

lr_y=LabelEncoder()
y=lr_y.fit_transform(y)

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=42)

#%%
from sklearn.linear_model import LinearRegression
lr=LinearRegression()
lr.fit(X_train,y_train)

enter image description here

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Неверное утверждение .

Полагаю, ваш источник machinelearningmastery - утверждение применяется к трансформатору StandardScaler, используемому в примере, но к не трансформаторам в целом;из исходного кода :

LabelEncoder (): "shape (n_samples,)"
StandardScaler (): "shape [n_samples, n_features]"

Так что да, ИНОГДА требуется изменение формы (например, StandardScaler), в других случаях это не так (LabelEncoder).Наконец, LinearRegression() ожидает, что X будет 2D, а y будет 1D.

0 голосов
/ 27 сентября 2019

Какой из них использовать, зависит от того, как вы хотите, чтобы ваши данные.df.iloc[:,2].values вернет один 1D numpy.ndarray, а df.iloc[:,2].values.reshape(-1,1) вернет ndarray из ndarray.

df.iloc[:,2].values.reshape(-1) вернет тот же вывод, что и df.iloc[:,2].values.Таким образом, добавляя дополнительный 1 в форму, вы в основном конвертируете каждый элемент массива в массив.

Edit:

clf.fit(df.iloc[:,2].values,df.iloc[:,2].values) выдаст ошибку ValueError: Expected 2D array, got 1D array instead:

clf.fit(df.iloc[:,2].values.reshape(-1,1),df.iloc[:,2].values) будет работать нормально.

...