目录
【教学赛】金融数据分析赛题2:保险反欺诈预测--天池大赛-阿里云天池
一.背景
【教学赛】金融数据分析赛题2:保险反欺诈预测--天池大赛-阿里云天池
二.赛题任务
预测用户的车险是否为欺诈行为
三.数据建模
1.这段代码的主要目的是加载一个包含保险数据的CSV文件,并展示数据的一部分
2.在这段代码中,只展示了加载数据并显示数据的基本步骤,后续可以进行数据清理、分析、建模等工作。需要注意的是,test.csv
和train.csv
有一些相同的列,但test.csv
中缺少了fraud
列(表示欺诈标记),这通常是因为test.csv
文件用于预测,而标签在测试集上是不可见的。
# 合并train, test
data = pd.concat([train, test], axis=0)
data
输出结果
这段代码重新设置了data
DataFrame的索引,并展示了数据
这段代码的目的是检查数据集中各列的缺失值情况,输出结果显示了每列的缺失值数量,其中fraud
列有300个缺失值。这通常是因为数据集中合并了训练集和测试集,测试集没有fraud
标签,因此有300个缺失值。其余列没有缺失值。
这段代码的目的是统计数据集中每列的唯一值个数。
从数据集中选择所有包含字符串类型(对象类型)的列,列出了如下19个类别特征列:
下面是类别特征的独特值数量汇总,并按照值的数量降序排列:
column_name = []
unique_value = []
for col in cat_columns:
#print(col, data[col].nunique())
column_name.append(col)
unique_value.append(data[col].nunique())
df = pd.DataFrame()
df['col_name'] = column_name
df['value'] = unique_value
df = df.sort_values('value', ascending=False)
df
data[cat_columns]
单独查看某个字段
# 单独看某个字段
data['property_damage'].value_counts()
data['property_damage'] = data['property_damage'].map({'NO': 0, 'YES': 1, '?': 2})
data['property_damage'].value_counts()
data['police_report_available'].value_counts()
data['police_report_available'] = data['police_report_available'].map({'NO': 0, 'YES': 1, '?': 2})
data['police_report_available'].value_counts()
查看大小日期
# policy_bind_date, incident_date
data['policy_bind_date'] = pd.to_datetime(data['policy_bind_date'])
data['incident_date'] = pd.to_datetime(data['incident_date'])
# 查看最大日期,最小日期
data['policy_bind_date'].min() # 1990-01-08
data['policy_bind_date'].max() # 2015-02-22
data['incident_date'].min() # 2015-01-01
data['incident_date'].max() # 2015-03-01
base_date = data['policy_bind_date'].min()
# 转换为date_diff
data['policy_bind_date_diff'] = (data['policy_bind_date'] - base_date).dt.days
data['incident_date_diff'] = (data['incident_date'] - base_date).dt.days
data['incident_date_policy_bind_date_diff'] = data['incident_date_diff'] - data['policy_bind_date_diff']
data[['policy_bind_date', 'incident_date', 'policy_bind_date_diff', 'incident_date_diff', 'incident_date_policy_bind_date_diff
去掉原始日期字段
# 去掉原始日期字段 policy_bind_date incident_date
data.drop(['policy_bind_date', 'incident_date'], axis=1, inplace=True)
data
#data['policy_id'].value_counts()
data.drop(['policy_id'], axis=1, inplace=True)
data.columns
已经成功对类别特征进行了标签编码。以下是处理后数据的摘要:
## 标签编码
from sklearn.preprocessing import LabelEncoder
cat_columns = data.select_dtypes(include='O').columns
for col in cat_columns:
le = LabelEncoder()
data[col] = le.fit_transform(data[col])
data[cat_columns]
# 数据集切分
train = data[data['fraud'].notnull()]
test = data[data['fraud'].isnull()]
import lightgbm as lgb
model_lgb = lgb.LGBMClassifier(
num_leaves=2**5-1, reg_alpha=0.25, reg_lambda=0.25, objective='binary',
max_depth=-1, learning_rate=0.005, min_child_samples=3, random_state=2022,
n_estimators=2000, subsample=1, colsample_bytree=1,
)
# 模型训练
model_lgb.fit(train.drop(['fraud'], axis=1), train['fraud'])
# AUC评测: 以proba进行提交,结果会更好
y_pred = model_lgb.predict_proba(test.drop(['fraud'], axis=1))
y_pred
# 25.8%
train['fraud'].mean()
y_pred[:, 1]
最后生成csv文件
result = pd.read_csv('./submission.csv')
result['fraud'] = y_pred[:, 1]
result.to_csv('./baseline.csv', index=False)
四.最终成绩