Разделить по столбцам (объекту) - PullRequest
0 голосов
/ 26 февраля 2019

При попытке сделать стратифицированное разбиение на столбец (категориальный) он возвращает мне ошибку.

Country     ColumnA    ColumnB   ColumnC   Label
AB            0.2        0.5       0.1       14  
CD            0.9        0.2       0.6       60
EF            0.4        0.3       0.8       5
FG            0.6        0.9       0.2       15  

Вот мой код:

X = df.loc[:, df.columns != 'Label']
y = df['Label']

# Train/test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=df.Country)

from sklearn.linear_model import LinearRegression
lm = LinearRegression()
lm.fit(X_train,y_train)
lm_predictions = lm.predict(X_test)

Итак, я получаю ошибку следующим образом:

ValueError: could not convert string to float: 'AB'

Ответы [ 2 ]

0 голосов
/ 28 марта 2019
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

df = pd.DataFrame({
        'Country': ['AB', 'CD', 'EF', 'FG']*20,
        'ColumnA' : [1]*20*4,'ColumnB' : [10]*20*4, 'Label': [1,0,1,0]*20
    })

df['Country_Code'] = df['Country'].astype('category').cat.codes

X = df.loc[:, df.columns.drop(['Label','Country'])]
y = df['Label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=df.Country_Code)
lm = LinearRegression()
lm.fit(X_train,y_train)
lm_predictions = lm.predict(X_test)
  • Преобразовать строковые значения в country в числа и сохранить их как новый столбец
  • При создании x удаление данных поезда label (y), а такжестрока country столбцы

Метод 2

Если ваши тестовые данные, по которым вы будете делать прогнозы, появятся позже, вам потребуется механизм для преобразования их country в code, прежде чем делать прогнозы.В таких случаях рекомендуется использовать LabelEncoder, для которого вы можете использовать метод fit для кодирования строк в метки, а затем использовать transform для кодирования страны тестовых данных.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import preprocessing

df = pd.DataFrame({
        'Country': ['AB', 'CD', 'EF', 'FG']*20,
        'ColumnA' : [1]*20*4,'ColumnB' : [10]*20*4, 'Label': [1,0,1,0]*20
    })

# Train-Validation 
le = preprocessing.LabelEncoder()
df['Country_Code'] = le.fit_transform(df['Country'])
X = df.loc[:, df.columns.drop(['Label','Country'])]
y = df['Label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0, stratify=df.Country_Code)
lm = LinearRegression()
lm.fit(X_train,y_train)

# Test
test_df = pd.DataFrame({'Country': ['AB'], 'ColumnA' : [1],'ColumnB' : [10] })
test_df['Country_Code'] = le.transform(test_df['Country'])
print (lm.predict(test_df.loc[:, test_df.columns.drop(['Country'])]))
0 голосов
/ 28 марта 2019

При воспроизведении вашего кода я обнаружил, что ошибка возникает из-за попытки подгонки модели линейной регрессии к набору функций, включающему строки. Этот ответ дает вам несколько вариантов того, что делать.Я бы предложил использовать X_train, X_test = pd.get_dummies(X_train.Country), pd.get_dummies(X_test.Country) для быстрого кодирования ваших стран после того, как вы запустили train_test_split (), чтобы сохранить баланс классов, который вы ищете.

...