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')
首先是进行数据的读取。导入pandas
和numpy
库,并且使用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_data
和test_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_data
和test_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_onethot
到train_data
和test_data
的udmap
列上,并将结果存储在train_udmap_df
和test_udmap_df
中。
train_data['udmap'].apply(udmap_onethot)
将函数udmap_onethot
应用到train_data
的udmap
列的每个元素上,并返回一个包含编码后结果的Series对象。
np.vstack
函数将Series对象转换为二维数组,并使用pd.DataFrame
将其转换为数据框。
最后,通过train_udmap_df.columns
和test_udmap_df.columns
分别为train_udmap_df
和test_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_df
和test_udmap_df
数据框与原始的train_data
和test_data
数据框按列进行合并。
pd.concat
函数接受一个列表作为参数,其中包含要合并的数据框。通过axis=1
参数指定按列进行合并。
在这里,train_data
和train_udmap_df
按列进行合并,结果存储回train_data
中。同样,test_data
和test_udmap_df
按列进行合并,结果存储回test_data
中。
合并后的数据框将包含原始数据框的所有列以及编码后的udmap
列数据。这样,train_data
和test_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_data
和test_data
数据框中。
首先,train_data['eid_freq'] = train_data['eid'].map(train_data['eid'].value_counts())
语句通过value_counts()
函数统计train_data
中eid
列中每个元素出现的频率,并使用map()
函数将频率映射到对应的eid
元素上。这样,新的eid_freq
列将包含与每个eid
元素对应的频率值。
类似地,test_data['eid_freq'] = test_data['eid'].map(train_data['eid'].value_counts())
语句对test_data
中的eid
列进行相同的操作,使用的是train_data
中eid
列的频率统计结果。这是因为在计算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_freq
和eid_mean
被添加到了train_data
和test_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_data
的udmap_isunknown
列。
这样,train_data
和test_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中的lightgbm
、sklearn.linear_model
和sklearn.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文件。