如何在数据框中创建加权特征?

How do I create a weighted feature in a dataframe?

我有一个数据框,它根据存储在列值中的其他分数创建最终分数。除了这些其他计分列外,还有一列显示玩家活跃的月数。

这些列是从 1 到 100 的整数,然后用于创建新功能 FS(最终得分)。这个特征是这些列值的总和,但是列值也被加权了。比如说,第 1 列乘以 0.15,因此它占结果特征的 15%。

我想弄清楚的是,假设其中一名玩家没有玩很长时间(由月份的专栏表示)。在这种情况下,我希望 S1 对他们的最终分数的计数更少。如果 'months' < 6.

,S1 占他们分数的 10% 而不是 15%

如何使这些分级权重灵活地适应这种情况?

代码:

scaler=MinMaxScaler(feature_range=(0, 100))

df_final['S1']=scaler.fit_transform(df_final[['S1']])
df_final['S2']=scaler.fit_transform(df_final[['S2']])
df_final['S3']=scaler.fit_transform(df_final[['S3']])
df_final['S4']=scaler.fit_transform(df_final[['S4']])

s1 = df_final['S1']
s2 = df_final['S2']
s3 = df_final['S3']
s4 = df_final['S4']

df_final['FS'] = (s1 * .15) + (s2 * .15) + (s3 * .50) + (s4 * .20)

结果 df:

    S1  S2  S3  S4  Months FS
0   49  66  44  9   4      50
1   36  66  44  10  11     49
2   28  77  33  17  17     52
3   39  66  44  4   2      48
4   32  44  44  17  4      35

尝试分配权重 np.where:

feature_df = df.iloc[:,:4]

weights = np.where(df.Months.lt(6).to_numpy()[...,None], (.1,.2,.3,.4), (.15,.15,.50, .20))

df['FS'] = feature_df.mul(weights).sum(1)

输出:

   S1  S2  S3  S4  Months     FS
0  49  66  44   9       4  34.90
1  36  66  44  10      11  39.30
2  28  77  33  17      17  35.65
3  39  66  44   4       2  31.90
4  32  44  44  17       4  32.00

使用连续的所有条件逻辑创建评分函数:

def score(row):
  if ....
     row['S1'] * ??

  return result

这将允许您添加任意复杂性来处理您的评分组合的细微差别

然后将其映射到您的 df

df['FS'] = df.apply(score, axis=1)