【笔记】用户新增预测挑战赛Baseline代码解读

In [ ]

import pandas as pd
import numpy as np

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

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')

首先是进行数据的读取。导入pandasnumpy库,并且使用pandas库读取CSV文件中的训练数据和测试数据。

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')train_datatest_data中的common_ts列的数据类型从整数(毫秒)转换为datetime类型,以便更方便地处理日期和时间数据。pd.to_datetime函数将整数转换为datetime对象,并使用unit='ms'参数指定输入数据的单位为毫秒。转换后的结果将存储回相应的数据框中的common_ts列。

In [ ]

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)]

接着是定义函数udmap_onethot(d)和一些相关的操作,用于处理train_datatest_data中的udmap列数据。

首先,函数udmap_onethot(d)定义了一个参数d,表示udmap列中的每个元素。

在函数内部,创建了一个长度为9的全零数组v,用于存储编码后的结果。

接下来,通过条件判断语句检查d的值是否为字符串'unknown'。如果是,则直接返回全零数组v,表示该元素无效或未知。

如果d的值不是'unknown',则使用eval函数将d转换为字典对象,并将结果赋值回d变量。这里假设d的格式为字符串形式的字典。

然后,通过一个循环从1到9,判断字典中是否存在键名为'key1'到'key9'的键。如果存在,则将对应的值赋值给v数组的相应位置(索引从0开始)。

最后,返回编码后的数组v

接下来的代码将应用函数udmap_onethottrain_datatest_dataudmap列上,并将结果存储在train_udmap_dftest_udmap_df中。

train_data['udmap'].apply(udmap_onethot)将函数udmap_onethot应用到train_dataudmap列的每个元素上,并返回一个包含编码后结果的Series对象。

np.vstack函数将Series对象转换为二维数组,并使用pd.DataFrame将其转换为数据框。

最后,通过train_udmap_df.columnstest_udmap_df.columns分别为train_udmap_dftest_udmap_df的列设置列名,列名为'key1'到'key9'。

In [ ]

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

这段代码使用pd.concat函数将编码后的train_udmap_dftest_udmap_df数据框与原始的train_datatest_data数据框按列进行合并。

pd.concat函数接受一个列表作为参数,其中包含要合并的数据框。通过axis=1参数指定按列进行合并。

在这里,train_datatrain_udmap_df按列进行合并,结果存储回train_data中。同样,test_datatest_udmap_df按列进行合并,结果存储回test_data中。

合并后的数据框将包含原始数据框的所有列以及编码后的udmap列数据。这样,train_datatest_data将包含额外的'key1'到'key9'列,这些列存储了udmap列的编码信息。

In [ ]

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())

 

这段代码用于计算并添加频次(freq)和均值(mean)两个新的特征列到train_datatest_data数据框中。

首先,train_data['eid_freq'] = train_data['eid'].map(train_data['eid'].value_counts())语句通过value_counts()函数统计train_dataeid列中每个元素出现的频率,并使用map()函数将频率映射到对应的eid元素上。这样,新的eid_freq列将包含与每个eid元素对应的频率值。

类似地,test_data['eid_freq'] = test_data['eid'].map(train_data['eid'].value_counts())语句对test_data中的eid列进行相同的操作,使用的是train_dataeid列的频率统计结果。这是因为在计算test_data的特征时,使用了训练数据的统计信息。

接下来,train_data['eid_mean'] = train_data['eid'].map(train_data.groupby('eid')['target'].mean())语句通过groupby()函数将train_data按照eid列进行分组,并计算每个分组中target列的均值。然后,使用map()函数将每个eid元素映射到对应的均值上。这样,新的eid_mean列将包含与每个eid元素对应的target均值。

同样,test_data['eid_mean'] = test_data['eid'].map(train_data.groupby('eid')['target'].mean())语句对test_data中的eid列进行相同的操作,使用的是train_data中按eid分组后的target均值。这也是因为在计算test_data的特征时,使用了训练数据的统计信息。

通过这些操作,新的特征列eid_freqeid_mean被添加到了train_datatest_data数据框中,以提供关于eid元素出现频率和target均值的信息。

 

In [ ]

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

 

这段代码用于创建一个新的特征列udmap_isunknown,表示udmap列中的元素是否为'unknown'。该特征列的值为二进制整数类型,表示元素是否为'unknown'的布尔值。

通过train_data['udmap_isunknown'] = ...将新的特征列赋值给train_data数据框的udmap_isunknown列。同样的操作也应用于test_data数据框,将结果赋值给test_dataudmap_isunknown列。

这样,train_datatest_data数据框中将包含一个名为udmap_isunknown的新特征列

In [ ]

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

 类似的,这段代码用于从common_ts列中提取小时信息,并创建一个新的特征列common_ts_hour

In [ ]

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']
)

这段代码使用了Python中的lightgbmsklearn.linear_modelsklearn.tree库来进行机器学习建模。训练过程中,从特征矩阵中删除了指定的列('udmap', 'common_ts', 'uuid', 'target'),并将剩余的特征作为输入特征,目标变量target作为目标值。

In [9]

pd.DataFrame({
    'uuid': test_data['uuid'],
    'target': clf.predict(test_data.drop(['udmap', 'common_ts', 'uuid'], axis=1))
}).to_csv('submit.csv', index=None)

 最后,生成一个包含预测结果的DataFrame,并将其保存为CSV文件。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值