Создание кадра данных без смещения из набора данных смещения в Pandas - PullRequest
0 голосов
/ 19 февраля 2020

Я работаю с набором данных COMPAS и собираюсь создать два Pandas DataFrame с данными - один со смещением и один без, разделив набор на два. На данный момент у меня есть работа ниже, которая создаст один фрейм данных, но он будет переносить смещение, изначально найденное в COMPAS, потому что для «replace» должно быть установлено значение True, учитывая распределение по размерам между расами.

import os
import tempfile
import urllib

_DATA_ROOT = tempfile.mkdtemp(prefix='tfx-data')
_DATA_PATH = 'https://storage.googleapis.com/what-if-tool-resources/computefest2019/cox-violent-parsed_filt.csv'
_DATA_FILEPATH = os.path.join(_DATA_ROOT, 'compas-scores-two-years.csv')
urllib.request.urlretrieve(_DATA_PATH, _DATA_FILEPATH)

_COMPAS_DF = _COMPAS_DF[_COMPAS_DF['is_recid'] != -1]
_GROUPBY_DF = _COMPAS_DF.groupby('race')
_COMPAS_DF = _GROUPBY_DF.apply(lambda x: x.sample(5000, replace=True).reset_index(drop=True))
_COMPAS_DF['race'].value_counts()

Вывод этого кадра данных ниже, но смещение 'is_recid', которое является логическим значением рецидивизма ответчика, остается неизменным.

African-American    5000
Other               5000
Caucasian           5000
Asian               5000
Hispanic            5000
Native American     5000
Name: race, dtype: int64

Начальный кадр данных указан ниже:

is_recid  Race              Count is_recid  
0         African-American  4338    24.79%
          Caucasian         3308    18.91%
          Hispanic          860     4.92%
          Other             502     2.87%
          Asian             45      0.26%
          Native American   26      0.15%
1         African-American  5081    29.04%
          Caucasian         2474    14.14%
          Hispanic          495     2.83%
          Other             323     1.85%
          Native American   25      0.14%
          Asian             19      0.11%
Total                       17496   100.00%

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

is_recid  Race              Count   is_recid    
0         African-American  3000    29.85%
          Caucasian         1500    14.93%
          Hispanic          300     2.99%
          Other             200     1.99%
          Asian             10      0.10%
          Native American   15      0.15%
1         African-American  3000    29.85%
          Caucasian         1500    14.93%
          Hispanic          300     2.99%
          Other             200     1.99%
          Native American   15      0.15%
          Asian             10      0.10%
Total                       10050   100.00%

Большое спасибо заранее!

1 Ответ

0 голосов
/ 19 февраля 2020

Ниже у меня получилось:

_COMPAS_DF_TUPLES = dict(tuple(_COMPAS_DF.groupby(['race', 'is_recid'])))
_UNBIASED_COMPAS = pd.DataFrame()
_BIASED_COMPAS = pd.DataFrame()

for race in _COMPAS_DF['race'].unique():
  # Find the minimum difference between race and is_recid to create an unbiased
  # dataset.
  min_bias_count = min(_COMPAS_DF_TUPLES[(race, 0)].shape[0],
                       _COMPAS_DF_TUPLES[(race, 1)].shape[0])

  # Split the data into two DataFrames --one biased and one unbiased.
  _UNBIASED_COMPAS = pd.concat(
      [_COMPAS_DF_TUPLES[(race, 0)][:min_bias_count], _UNBIASED_COMPAS])
  _UNBIASED_COMPAS = pd.concat(
      [_COMPAS_DF_TUPLES[(race, 1)][:min_bias_count], _UNBIASED_COMPAS])

  _BIASED_COMPAS = pd.concat(
      [_COMPAS_DF_TUPLES[(race, 0)][min_bias_count:], _BIASED_COMPAS])
  _BIASED_COMPAS = pd.concat(
      [_COMPAS_DF_TUPLES[(race, 1)][min_bias_count:], _BIASED_COMPAS])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...