Как выполнить однократное кодирование как для обучающего, так и для тестового набора данных? - PullRequest
0 голосов
/ 07 февраля 2020

У меня возникла проблема с использованием модели для прогнозирования входных данных моего тестирования, но число функций не совпадает между этими наборами данных. Поэтому я решил следовать методу, описанному в статье о том, как преодолеть эту проблему несоответствия, которая объединяет два набора данных и кодирование в объединенном наборе данных. Вот как я делаю шаги объединения:

data_raw = pd.read_sql(sql,cnxn)

#Exploring the Columns in the Data Set
pd.Series(data_raw.columns) 
pd.Series(data_raw.dtypes)

data_raw.describe(include='all')

data_raw['collision_type'] = data_raw.loc[0:, 'collision_type'].replace('?', 'Unknown')
data_raw['property_damage'] = data_raw.loc[0:, 'property_damage'].replace('?', 'Unknown')

data_raw.isnull().sum()

dropping_columns = ['months_as_customer', 'age', 'policy_number', 'policy_bind_date', 'policy_annual_premium', 'insured_zip', 
                    'capital_gains', 'capital_loss', 'total_claim_amount', 'injury_claim', 'property_claim', 'vehicle_claim',
                   'auto_year']

data_cleaned = data_raw.drop(dropping_columns, axis=1)
data_cleaned_dropped = data_cleaned.drop(['fraud_reported'], axis=1)



test_raw = pd.read_sql(sql,cnxn)

test_raw.describe(include='all')

test_raw['collision_type'] = data_raw.loc[0:, 'collision_type'].replace('?', 'Unknown')

test_raw['property_damage'] = data_raw.loc[0:, 'property_damage'].replace('?', 'Unknown')

test_raw.isnull().sum()

test_dropped = test_raw.drop(dropping_columns, axis=1)


data_cleaned_dropped['train'] = 1
test_dropped['train'] = 0

combined = pd.concat([data_cleaned_dropped, test_dropped])

df = pd.get_dummies(combined, drop_first=True)

combined = pd.concat([combined,df], axis=1)

train_df = combined[combined["train"] == 1] ##This is where the error happened
test_df = combined[combined["train"] == 0]
train_df.drop(["train"], axis=1, inplace=True) 
test_df.drop(["train"], axis=1, inplace=True)

Это ошибка, которую я получил:

Traceback (most recent call last):

  File "<ipython-input-165-e6d470e94433>", line 1, in <module>
    runfile('C:/Users/BusinessUser/Downloads/insurance_claim_fraud_detection-master/insurance_claim_fraud_detection.py', wdir='C:/Users/BusinessUser/Downloads/insurance_claim_fraud_detection-master')

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/BusinessUser/Downloads/insurance_claim_fraud_detection-master/insurance_claim_fraud_detection.py", line 139, in <module>
    train_df = combined[combined["train"] == 1]

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\core\frame.py", line 2967, in __getitem__
    return self._getitem_frame(key)

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3067, in _getitem_frame
    return self.where(key)

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\core\generic.py", line 9276, in where
    cond, other, inplace, axis, level, errors=errors, try_cast=try_cast

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\core\generic.py", line 9123, in _where
    axis=block_axis,

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\core\internals\managers.py", line 557, in where
    return self.apply("where", **kwargs)

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\core\internals\managers.py", line 436, in apply
    kwargs[k] = obj.reindex(b_items, axis=axis, copy=align_copy)

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\util\_decorators.py", line 221, in wrapper
    return func(*args, **kwargs)

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3961, in reindex
    return super().reindex(**kwargs)

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\core\generic.py", line 4514, in reindex
    axes, level, limit, tolerance, method, fill_value, copy

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3843, in _reindex_axes
    columns, method, copy, level, fill_value, limit, tolerance

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3891, in _reindex_columns
    allow_dups=False,

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\core\generic.py", line 4577, in _reindex_with_indexers
    copy=copy,

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\core\internals\managers.py", line 1251, in reindex_indexer
    self.axes[axis]._can_reindex(indexer)

  File "C:\Users\BusinessUser\Anaconda3\lib\site-packages\pandas\core\indexes\base.py", line 3362, in _can_reindex
    raise ValueError("cannot reindex from a duplicate axis")

ValueError: cannot reindex from a duplicate axis

Для вашей информации, в моем наборе обучающих данных есть последний столбец для результата прогнозирования, в то время как у моего набора данных тестирования также есть такие столбцы, но все значения NULL. Я просто хочу знать, сталкивался ли кто-нибудь с такой же проблемой в прошлом, поэтому я мог бы получить некоторый опыт, как преодолеть эту проблему несоответствия любыми способами.

Кроме того, я просто хочу спросить, чтобы работает конкатенация данных, должны ли совпадать столбцы между набором данных поезда и тестовым вводом? Я просто думаю, что столбец прогнозируемого результата не существует во входных данных теста, так как это работает? Любые комментарии очень ценятся.

Спасибо вам, ребята, за помощь!

...