Как изменить форму тестового фрейма так, чтобы измерение было таким же, как и в работах по обучению и прогнозированию? - PullRequest
1 голос
/ 11 июля 2019

Необходимо знать, какие изменения необходимо внести, чтобы тестовые данные имели тот же уровень закодированного столбца, что и подготовка к прогнозированию, чтобы работать ... Теперь происходит сбой с ошибкой измерения.

Проверено в форумах на предмет аналогичного запроса..

import pandas as pd
import sklearn
from sklearn.linear_model import LinearRegression
# initialize list of lists 
data = [[1001, 10,'Male',38], [2001, 15,'Male',50], [2004, 12,'FeMale',40]] 

# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['StudentId', 'Age','Gender','Weight']) 

#Define y , X, test and train

y=df['Weight']
X=df[['StudentId','Age','Gender']] 
# One-hot encode the data using pandas get_dummies
X = pd.get_dummies(X)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=66)

X_test.head()
----
StudentId   Age Gender_FeMale   Gender_Male
1   2001    15  0   1
---
# linear regression model creation
lm_model = LinearRegression()
lm_model.fit(X_train,y_train)

# predictions
lm_model.predict(X_test)

---works fine till now..--
When we now create a single test record and test it fails as the dimension mismatch happens,,, Does one have to manually add another encoded dimension or some clean approach is there...please advice..

sample_testdata=[[4001, 10,'FeMale']]
# Create the pandas DataFrame 
sample_testDF= pd.DataFrame(sample_testdata, columns = ['StudentId', 'Age','Gender']) 

sample_testDF_encoded=pd.get_dummies(sample_testDF)
-----
    StudentId   Age Gender_FeMale
0   4001    10  1

---

lm_model.predict(sample_testDF_encoded)

--Error----

ValueError: shapes (1,3) and (4,) not aligned: 3 (dim 1) != 4 (dim 0)

Прогнозирование для одной тестовой записи не выполняется, поскольку get_dummies выдает один столбец ...

Ответы [ 3 ]

1 голос
/ 11 июля 2019

Для удобства пользователей вы можете добавить несколько категорий и преобразовать их в переменную pandas категорического после ввода пользователя и перед использованием одного горячего кодирования / get_dummies.Что-то вроде:

# Sample input from user
sample_testdata = [[4001, 10,'FeMale']]
sample_testDF = pd.DataFrame(sample_testdata, columns = ['StudentId', 'Age','Gender'])

# Add categories and convert to categorical variable
sample_testDF['Gender'] = pd.Categorical(sample_testDF['Gender'], 
                                         categories = ["Male", "FeMale"])

# Create dummies and index columns based on your X_test/ X_train
sample_testDF_dum = pd.get_dummies(sample_testDF)[X_test.columns]
sample_testDF_dum

#    StudentId  Age Gender_FeMale   Gender_Male
# 0       4001  10  1               0
1 голос
/ 11 июля 2019
print(X_train.columns)

это производит:

Index(['StudentId', 'Age', 'Gender_FeMale', 'Gender_Male'], dtype='object')

print(sample_testDF_encoded.columns)

это производит:

Index(['StudentId', 'Age', 'Gender_FeMale'], dtype='object')

Итак, проблема в том, что ваш горячий кодировщик создает два столбца для пола в основных данных, где значение полаэто либо Male, либо FeMale (он кодирует Gender_FeMale в 1, если ваши данные содержат самку, он кодирует Gender_Male в 1, если ваши данные содержат самца) Но ваш sample_testDF содержит только одно значение, которое является FeMale.Таким образом, один горячий кодер не создает 2 столбца на этот раз для пола.Итак, это совпадение мисс

Итак, ваши тестовые данные должны выглядеть следующим образом:

sample_testdata=[[4001, 10,1, 0]]
# Create the pandas DataFrame 
sample_testDF= pd.DataFrame(sample_testdata, columns = ['StudentId', 'Age','Gender_FeMale', 'Gender_Male']) 

Изменение этих буксировочных линий устранит ошибку и даст вам результат прогноза

Как выВ приведенном в комментарии примере данные вводятся пользователем, поэтому вы должны преобразовать их, как я ответил в этом комментарии.Вы можете создать преобразованный список данных, чем создать Dataframe с этим преобразованным списком:

sample_testdata= [[4001, 10,'FeMale']]

convertedDataList = []
for data in sample_testdata:
    if data[2] == 'FeMale':
        data[2] = 1
        data.append(0)
    else:
        data[2] = 0
        data.append(1) 
    convertedDataList.append(data)


# Create the pandas DataFrame  using convertedDataList
sample_testDF= pd.DataFrame(convertedDataList, columns = ['StudentId', 'Age','Gender_FeMale', 'Gender_Male']) 
0 голосов
/ 11 июля 2019

Вы получаете эту ошибку, потому что

sample_testdata=[[4001, 10,'FeMale']]
sample_testDF= pd.DataFrame(sample_testdata, columns = ['StudentId', 'Age','Gender']) 
sample_testDF_encoded=pd.get_dummies(sample_testDF)
gives the output :
 StudentId     Age    Gender_FeMale
    4001        10      1

, но ваш тестовый пример должен иметь еще один столбец Gender_Male, так как в вашем наборе данных trainig есть столбец Gender_Male, поэтому в этом столбце приведено несоответствие столбца, поэтому вам необходимо выполнить одно из следующих действий:опция:

sample_testdata=[[4001, 10,'FeMale'],[4001, 10,'Male']]
OR
sample_testDF= pd.DataFrame(sample_testdata, columns = ['StudentId', 'Age','Gender_FeMale', 'Gender_Male'])

эта дает мне следующий вывод:

sample_testdata=[[4001, 10,'FeMale'],[4001, 10,'Male']]
lm_model.predict(sample_testDF_encoded)
array([43.98202214, 43.98201816])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...