用户新增预测挑战赛

赛题思路

1.数据预处理

  • 加载训练集和测试集数据。
  • 检查数据缺失值并进行处理,例如使用均值、中位数或其他合适的填充方法。
  • 对时间戳字段进行特征工程,例如提取年、月、日、小时等信息。

2.特征工程:

  • 对行为属性进行编码,可以使用Label Encoding或One-Hot Encoding。
  • 提取用户相关属性的统计特征,例如平均值、最大值、最小值等。
  • 创建新的特征,例如不同属性之间的组合特征、时间相关特征等。

3.模型选择和训练:

  • 选择适当的分类算法,如逻辑回归、随机森林、XGBoost、LightGBM等。
  • 初始尝试可以从较简单的算法开始。
  • 将数据集分为训练集和验证集,用于模型训练和评估。
  • 使用训练集训练模型,根据验证集的表现进行调参,优化模型表现。

4.模型评估和调优:

  • 使用f1_score作为评价指标,对训练出的模型在验证集上进行评估。
  • 根据模型在验证集上的表现,进行超参数调整,如调整学习率、树的数量、深度等。
  • 可以尝试不同的特征组合和选择以优化模型性能。

5.预测与提交:

  • 使用训练集训练得到的最佳模型,对测试集进行预测得到预测结果。
  • 根据比赛要求,将预测结果保存并提交到比赛平台。

6.模型优化:

  • 尝试更复杂的模型,如集成方法(如XGBoost、LightGBM)等,以提高预测性能。
  • 使用特征选择方法,排除对预测性能贡献较小的特征。
  • 进行模型融合,将多个表现良好的模型的预测结果进行加权平均或投票。

7.反思和迭代:

  • 分析比赛结果,了解模型在不同方面的表现,思考哪些方面可以进一步改进。
  • 尝试不同的特征工程方法、模型选择以及超参数调整,以找到更好的模型性能。

这只是一个基础的Baseline思路,实际上在比赛中,你可能需要多次尝试不同的方法和策略,进行反复的迭代和优化。记得在整个过程中保持对数据的深入理解,并且尽量充分利用你的数据挖掘和机器学习知识来解决问题。

浅谈F1

F1分数是一种用于评估二元分类系统的准确性的度量。它结合了模型的精度和召回率,定义为模型精度和召回率的调和平均值³。F1分数可以解释为精度和召回率的调和平均数,其中F1分数在1时达到最佳值,在0时达到最差分数¹。更通用的分数应用了额外的权重,比一个精度或召回率更重要²。F1分数是精度和召回率的对称表示²。

F1分数的计算公式如下:
F 1 = 2 ∗ P r e c i s i o n ∗ R e c a l l P r e c i s i o n + R e c a l l F_1 = 2 * \frac{Precision * Recall}{Precision + Recall} F1=2Precision+RecallPrecisionRecall

在多类和多标签情况下,这是每个类别的F1分数的平均值,加权取决于平均参数²。

在Python中,可以通过加载sklearn包,方便地使用f1_score函数。函数原型如下:

sklearn.metrics.f1_score(y_true, y_pred, labels=None, pos_label=1, average='binary', sample_weight=None)

参数:

  • y_true: 一维数组或标签指示数组/稀疏矩阵。目标的真实类别。
  • y_pred: 一维数组或标签指示数组/稀疏矩阵。分类器预测得到的类别。
  • average: 字符串,[None, ‘binary’ (default), ‘micro’, ‘macro’, ‘samples’, ‘weighted’]。如果是二分类问题,则选择参数’binary’;如果考虑类别的不平衡性,需要计算类别的加权平均,则使用’weighted’;如果不考虑类别的不平衡性,计算宏平均,则使用’macro’。

示例程序:

from sklearn.metrics import f1_score
y_pred = [0, 1, 1, 1, 2, 2]
y_true = [0, 1, 0, 2, 1, 1]
print(f1_score(y_true, y_pred, average='macro'))

Baseline

import pandas as pd
import numpy as np

train_data = pd.read_csv('用户新增预测挑战赛公开数据/train.csv')
test_data = pd.read_csv('用户新增预测挑战赛公开数据/test.csv')

# 将训练数据和测试数据中的 'common_ts' 列(时间戳)转换为日期时间对象
# 这里使用了 pd.to_datetime() 函数,将时间戳转换为日期时间对象
# unit='ms' 表示时间戳的单位是毫秒
train_data['common_ts'] = pd.to_datetime(train_data['common_ts'], unit='ms')
test_data['common_ts'] = pd.to_datetime(test_data['common_ts'], unit='ms')

def udmap_onethot(d):
    v = np.zeros(9)
    if d == 'unknown':
        return v
    
    d = eval(d)
    for i in range(1, 10):
        if 'key' + str(i) in d:
            v[i-1] = d['key' + str(i)]
            
    return v

train_udmap_df = pd.DataFrame(np.vstack(train_data['udmap'].apply(udmap_onethot)))
test_udmap_df = pd.DataFrame(np.vstack(test_data['udmap'].apply(udmap_onethot)))

train_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]
test_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]

train_data = pd.concat([train_data, train_udmap_df], axis=1)
test_data = pd.concat([test_data, test_udmap_df], axis=1)

train_data['eid_freq'] = train_data['eid'].map(train_data['eid'].value_counts())
test_data['eid_freq'] = test_data['eid'].map(train_data['eid'].value_counts())

train_data['eid_mean'] = train_data['eid'].map(train_data.groupby('eid')['target'].mean())
test_data['eid_mean'] = test_data['eid'].map(train_data.groupby('eid')['target'].mean())

train_data['udmap_isunknown'] = (train_data['udmap'] == 'unknown').astype(int)
test_data['udmap_isunknown'] = (test_data['udmap'] == 'unknown').astype(int)

train_data['common_ts_hour'] = train_data['common_ts'].dt.hour
test_data['common_ts_hour'] = test_data['common_ts'].dt.hour


import lightgbm as lgb
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier()
clf.fit(
    train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),
    train_data['target']
)

result_df = pd.DataFrame({
    'uuid':test_data['uuid'],
    'target':clf.predict(test_data.drop(['udmap', 'common_ts', 'uuid'], axis = 1))
})
result_df.to_csv('submit.csv', index = None)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值