在一次热编码后获取功能名称

时间:2016-12-08 04:26:18

标签: python scikit-learn one-hot-encoding

我有一个数据集,我最近通过一个热门编码进行了转换,并使用它训练了一个套索逻辑回归。我正在尝试获得非零系数的列表。我可以通过sklearn获得系数列表,但我不确定如何在一次热编码后将它们映射回数据。

数据集的一小段摘录(前面有一个热门编码)

  {'acc_now_delinq': {29601: 0.0,
  143234: 0.0,
  157345: 0.0,
  158754: 0.0,
  229042: 0.0},
 'application_type': {29601: 0, 143234: 0, 157345: 0, 158754: 0, 229042: 0},
 'collections_12_mths_ex_med': {29601: 0.0,
  143234: 0.0,
  157345: 0.0,
  158754: 0.0,
  229042: 0.0},
 'credit_age': {29601: 118.0,
  143234: 157.0,
  157345: 213.0,
  158754: 269.0,
  229042: 240.0},
 'delinq_2yrs': {29601: 0.0,
  143234: 0.0,
  157345: 0.0,
  158754: 0.0,
  229042: 0.0},
 'dti': {29601: 2.0600000000000001,
  143234: 23.710000000000001,
  157345: 18.960000000000001,
  158754: 18.690000000000001,
  229042: 22.530000000000001},
 'emp_length_num': {29601: 8.0,
  143234: 2.0,
  157345: 1.0,
  158754: 7.0,
  229042: 1.0},
 'home_ownership': {29601: 4, 143234: 5, 157345: 5, 158754: 1, 229042: 1},
 'inq_last_6mths': {29601: 2.0,
  143234: 0.0,
  157345: 0.0,
  158754: 0.0,
  229042: 0.0},
 'loan_amnt': {29601: 214.0,
  143234: 211.0,
  157345: 571.0,
  158754: 937.0,
  229042: 466.0},
 'loan_status': {29601: 0, 143234: 1, 157345: 0, 158754: 1, 229042: 1},
 'log_annual_inc': {29601: 11.225243392499999,
  143234: 10.8022251252,
  157345: 11.0020998412,
  158754: 11.6952470218,
  229042: 11.225243392499999},
 'open_acc': {29601: 5.0,
  143234: 21.0,
  157345: 11.0,
  158754: 9.0,
  229042: 14.0},
 'pub_rec': {29601: 0.0, 143234: 0.0, 157345: 0.0, 158754: 0.0, 229042: 0.0},
 'purpose': {29601: 4, 143234: 2, 157345: 2, 158754: 2, 229042: 2},
 'revol_bal': {29601: 2266.0,
  143234: 12254.0,
  157345: 20657.0,
  158754: 11367.0,
  229042: 39404.0},
 'revol_inc_ratio': {29601: 0.030213333333299997,
  143234: 0.24941990637100001,
  157345: 0.34428333333300004,
  158754: 0.094725000000000004,
  229042: 0.52538666666699996},
 'revol_util': {29601: 44.0,
  143234: 89.400000000000006,
  157345: 76.900000000000006,
  158754: 81.200000000000003,
  229042: 95.5},
 'tot_coll_amt': {29601: 0.0,
  143234: 0.0,
  157345: 0.0,
  158754: 0.0,
  229042: 0.0},
 'tot_cur_bal': {29601: 2266.0,
  143234: 115947.0,
  157345: 80598.0,
  158754: 347695.0,
  229042: 355741.40000000002},
 'total_acc': {29601: 5.0,
  143234: 41.0,
  157345: 35.0,
  158754: 17.0,
  229042: 30.0},
 'total_rev_hi_lim': {29601: 5100.0,
  143234: 13700.0,
  157345: 26900.0,
  158754: 14000.0,
  229042: 80780.0},
 'verification_status': {29601: 0, 143234: 2, 157345: 1, 158754: 2, 229042: 1}}

我的热门编码:

def one_hot(df):
# Categorical columns for use in one-hot encoder
categorical = (df.dtypes.values != np.dtype('float64'))
print categorical

# Get numpy array from data
x = df.values[:, :-1]
y = df.values[:, -1]

# Apply one hot endcoing
encoder = preprocessing.OneHotEncoder(categorical_features=categorical[:-1], sparse=False)  # Last value in mask is y
x = encoder.fit_transform(x)

return x, y

1 个答案:

答案 0 :(得分:1)

假设您将一小部分数据集摘录存储在名为temp的变量中:

temp = pd.DataFrame(temp)
categorical = (temp.dtypes.values != np.dtype('float64'))
categorical = temp.columns[categorical]

def one_hot(temp, categorical):
    # temp is the data frame from which the "categorical" columns need to be One hot encoded
    from sklearn.preprocessing import OneHotEncoder
    enc_model = OneHotEncoder(sparse=False)
    X = enc_model.fit_transform(temp[categorical])
    uniq_vals = temp[categorical].apply(lambda x: x.value_counts()).unstack()
    uniq_vals = uniq_vals[~uniq_vals.isnull()]
    enc_cols = list(uniq_vals.index.map('{0[0]}_{0[1]}'.format)) # https://stackoverflow.com/questions/41987743/merge-two-multiindex-levels-into-one-in-pandas
    enc_df = pd.DataFrame(X, columns=enc_cols, index=temp.index, dtype='bool')

    return(enc_df)