├── README.md
├── 前期基線
├── README.MD
├── 预测.py
└── 預測.py
└── 預測.py
/README.md:
--------------------------------------------------------------------------------
1 | # 202104-RG
2 | ### [人岗精准匹配模型](https://www.sodic.com.cn/competitions/900008)
3 |
4 |
5 |
--------------------------------------------------------------------------------
/前期基線/README.MD:
--------------------------------------------------------------------------------
1 | # 前期基線
2 | F1評測,且數據量小,對自己運炁比䡈自信的同學可以認眞乍一下。
3 | 這裏給出一箇簡單基線,成績大約0.85。
4 |
5 | **20210507更新:**
6 | 應部分同學要求,提供簡化字版代馬。雖肰按理來說傳統字版和簡化字版應該㝵到相同旳成績,但玄學因素總是存在的。傳統字版代馬使用更正式的文字,也許不知道什么旹候就會㝵到更高旳成績呢。祝伱們好運。^_^
7 |
8 |
9 |
10 |
11 | F1评测,且数据量小,对自己运气比较自信的同学可以认真做一下。
12 | 这里给出一个简单基线,成绩大约0.85。
13 |
14 | **20210507更新:**
15 | 应部分同学要求,提供简化字版代码。虽然按理来说传统字版和简化字版应该得到相同的成绩,但玄学因素总是存在的。传统字版代码使用更正式的文字,也许不知道什么时候就会得到更高的成绩呢。祝你们好运。^_^
16 |
17 |
18 |
19 |
20 | A 5681/35566
21 |
--------------------------------------------------------------------------------
/前期基線/预测.py:
--------------------------------------------------------------------------------
1 | # python 3.9.2
2 | # python包 lightgbm 3.1.1
3 | # python包 numpy 1.20.1
4 | # python包 pandas 1.2.2
5 | #
6 | # 输入:
7 | # trainset/person.csv
8 | # trainset/person_cv.csv
9 | # trainset/person_job_hist.csv
10 | # trainset/person_pro_cert.csv
11 | # trainset/person_project.csv
12 | # trainset/recruit.csv
13 | # trainset/recruit_folder.csv
14 | # testset/recruit_folder.csv
15 | #
16 | # 输出:
17 | # result.csv
18 | #
19 | # 0.8516
20 | #
21 | import numpy
22 | import pandas
23 | import random
24 | import sklearn
25 | import lightgbm
26 |
27 | 求职者表 = pandas.read_csv("trainset/person.csv", header=0, names=["求职者编号", "性別", "工作年限", "最高学历", "应聘者专业", "年龄", "最近工作岗位", "最近所在行业", "当前工作所在地", "语言能力", "专业特长"])
28 | 求职者表.性別 = (求职者表.性別 == "女").astype("float")
29 | 求职者表.最高学历 = 求职者表.最高学历.map({"其它": 0, "中专": 1, "高中(职高、技校)": 2, "大专": 3, "大学本科": 4, "硕士研究生": 5, "博士研究生": 6, "博士后": 7})
30 | 求职者表.应聘者专业 = 求职者表.应聘者专业.astype("category")
31 | 意向表 = pandas.read_csv("trainset/person_cv.csv", header=0, names=["求职者编号", "自荐信", "岗位类别", "工作地点", "所在行业", "可到职天数", "其他说明"])
32 | 意向表["自荐信字数"] = 意向表.自荐信.str.len()
33 | 工作经历表 = pandas.read_csv("trainset/person_job_hist.csv", header=0, names=["求职者编号", "岗位类别", "单位所在地", "单位所属行业", "主要业绩"])
34 | 工作经历表["主要业绩字数"] = 工作经历表.主要业绩.str.len()
35 | 专业证书表 = pandas.read_csv("trainset/person_pro_cert.csv", header=0, names=["求职者编号", "专业证书名称", "备注"])
36 | 项目经验表 = pandas.read_csv("trainset/person_project.csv", header=0, names=["求职者编号", "项目名称", "项目说明", "职责说明", "关键技术"])
37 | 岗位表 = pandas.read_csv("trainset/recruit.csv", header=0, names=["岗位编号", "招聘对象代码", "招聘对象", "招聘职位", "对应聘者的专业要求", "岗位最低学历", "岗位工作地点", "岗位工作年限", "具体要求"])
38 | 岗位表.招聘对象代码 = 岗位表.招聘对象代码.fillna(-1).astype("category")
39 | 岗位表.招聘对象 = 岗位表.招聘对象.astype("category")
40 | 岗位表.岗位最低学历 = 岗位表.岗位最低学历.map({"其它": 0, "中专": 1, "高中(职高、技校)": 2, "大专": 3, "大学本科": 4, "硕士研究生": 5, "博士研究生": 6, "博士后": 7})
41 | 岗位表.岗位工作年限 = 岗位表.岗位工作年限.map({"不限": -1, "应届毕业生": 0, "0至1年": 0, "1至2年": 1, "3至5年": 3, "5年以上": 5})
42 | 岗位表["具体要求字数"] = 岗位表.具体要求.str.len()
43 |
44 | 工作经历数据表 = 工作经历表.groupby("求职者编号").aggregate({"岗位类别": "count", "主要业绩字数": ["mean", "sum"]}).reset_index()
45 | 工作经历数据表.columns = ["求职者编号", "工作经历数", "平均主要业绩字数", "总主要业绩字数"]
46 | 项目经验数据表 = 项目经验表.groupby("求职者编号").aggregate({"项目名称": "count"}).reset_index()
47 | 项目经验数据表.columns = ["求职者编号", "项目经验数"]
48 |
49 | 训练表 = pandas.read_csv("trainset/recruit_folder.csv", header=0, names=["岗位编号", "求职者编号", "标签"])
50 | 测试表 = pandas.read_csv("testset/recruit_folder.csv", header=0, names=["岗位编号", "求职者编号", "标签"])
51 |
52 | 测訓表 = pandas.concat([测试表, 训练表], ignore_index=True)
53 | 求职者数据表 = 测訓表.groupby("求职者编号").aggregate({"岗位编号": "count"}).reset_index()
54 | 求职者数据表.columns = ["求职者编号", "求职者数"]
55 | 岗位数据表 = 测訓表.groupby("岗位编号").aggregate({"求职者编号": "count"}).reset_index()
56 | 岗位数据表.columns = ["岗位编号", "岗位数"]
57 |
58 |
59 | def 取得数据表(某表, 某特征表):
60 | 某特征求职者数据表 = 某特征表.groupby("求职者编号").aggregate({"标签": "mean"}).reset_index()
61 | 某特征求职者数据表.columns = ["求职者编号", "求职者平均标签"]
62 | 某特征岗位数据表 = 某特征表.groupby("岗位编号").aggregate({"标签": "mean"}).reset_index()
63 | 某特征岗位数据表.columns = ["岗位编号", "岗位平均标签"]
64 |
65 | 某表 = 某表.merge(求职者表, on="求职者编号", how="left")
66 | 某表 = 某表.merge(意向表, on="求职者编号", how="left")
67 | 某表 = 某表.merge(岗位表, on="岗位编号", how="left")
68 | 某表 = 某表.merge(项目经验数据表, on="求职者编号", how="left")
69 | 某表 = 某表.merge(工作经历数据表, on="求职者编号", how="left")
70 | 某表 = 某表.merge(求职者数据表, on="求职者编号", how="left")
71 | 某表 = 某表.merge(岗位数据表, on="岗位编号", how="left")
72 | 某表 = 某表.merge(某特征求职者数据表, on="求职者编号", how="left")
73 | 某表 = 某表.merge(某特征岗位数据表, on="岗位编号", how="left")
74 | 某表["工作地点符合否"] = (某表.工作地点 == 某表.岗位工作地点).astype("float")
75 |
76 | 某数据表 = 某表.loc[:, ["岗位编号", "求职者编号", "标签"
77 | , "性別", "工作年限", "最高学历", "应聘者专业", "年龄", "自荐信字数", "可到职天数"
78 | , "项目经验数"
79 | , "工作经历数", "平均主要业绩字数", "总主要业绩字数"
80 | , "招聘对象代码", "招聘对象", "岗位最低学历", "岗位工作年限", "具体要求字数", "工作地点符合否"
81 | , "求职者数", "岗位数"
82 | , "求职者平均标签", "岗位平均标签"
83 | ]]
84 |
85 | 某数据表 = 某数据表.loc[:, ["岗位编号", "求职者编号", "标签"] + [子 for 子 in 某数据表.columns if 子 not in ["岗位编号", "求职者编号", "标签"]]]
86 |
87 | return 某数据表
88 |
89 |
90 | 折数 = 4
91 | 训练数据表 = None
92 | for 甲 in range(折数):
93 | 甲标签表 = 训练表[训练表.index % 折数 == 甲].reset_index(drop=True)
94 | 甲特征表 = 训练表[训练表.index % 折数 != 甲].reset_index(drop=True)
95 |
96 | 甲数据表 = 取得数据表(甲标签表, 甲特征表)
97 | 训练数据表 = pandas.concat([训练数据表, 甲数据表], ignore_index=True)
98 |
99 | 轻模型 = lightgbm.train(train_set=lightgbm.Dataset(训练数据表.iloc[:, 3:], label=训练数据表.标签)
100 | , num_boost_round=500, params={"objective": "binary", "learning_rate": 0.03, "max_depth": 6, "num_leaves": 32, "verbose": -1, "bagging_fraction": 0.8, "feature_fraction": 0.8}
101 | )
102 |
103 | 测试数据表 = 取得数据表(测试表, 训练表)
104 | 预测表 = 测试数据表.loc[:, ["岗位编号", "求职者编号"]]
105 | 预测表["预测打分"] = 轻模型.predict(测试数据表.iloc[:, 3:])
106 | 预测表 = 预测表.sort_values("预测打分", ascending=False, ignore_index=True)
107 | 预测表["预测"] = 0
108 | 预测表.loc[:int(0.15 * len(预测表)), ["预测"]] = 1
109 |
110 |
111 | 提交表 = 预测表.loc[:, ["岗位编号", "求职者编号", "预测"]]
112 | 提交表.columns = ["RECRUIT_ID", "PERSON_ID", "LABEL"]
113 | 提交表.to_csv("result.csv", index=False)
114 |
--------------------------------------------------------------------------------
/前期基線/預測.py:
--------------------------------------------------------------------------------
1 | # python 3.9.2
2 | # python套件 lightgbm 3.1.1
3 | # python套件 numpy 1.20.1
4 | # python套件 pandas 1.2.2
5 | #
6 | # 輸入:
7 | # trainset/person.csv
8 | # trainset/person_cv.csv
9 | # trainset/person_job_hist.csv
10 | # trainset/person_pro_cert.csv
11 | # trainset/person_project.csv
12 | # trainset/recruit.csv
13 | # trainset/recruit_folder.csv
14 | # testset/recruit_folder.csv
15 | #
16 | # 輸出:
17 | # result.csv
18 | #
19 | # 0.8516
20 | #
21 | import numpy
22 | import pandas
23 | import random
24 | import sklearn
25 | import lightgbm
26 |
27 | 求職者表 = pandas.read_csv("trainset/person.csv", header=0, names=["求職者編號", "性別", "工作年限", "最高學歴", "應聘者專業", "年齡", "最近工作崗位", "最近所在行業", "当前工作所在地", "語言能力", "專業特長"])
28 | 求職者表.性別 = (求職者表.性別 == "女").astype("float")
29 | 求職者表.最高學歴 = 求職者表.最高學歴.map({"其它": 0, "中专": 1, "高中(职高、技校)": 2, "大专": 3, "大学本科": 4, "硕士研究生": 5, "博士研究生": 6, "博士后": 7})
30 | 求職者表.應聘者專業 = 求職者表.應聘者專業.astype("category")
31 | 意向表 = pandas.read_csv("trainset/person_cv.csv", header=0, names=["求職者編號", "自薦信", "崗位類別", "工作地點", "所在行業", "可到職天數", "其他説明"])
32 | 意向表["自薦信字數"] = 意向表.自薦信.str.len()
33 | 工作經歴表 = pandas.read_csv("trainset/person_job_hist.csv", header=0, names=["求職者編號", "崗位類別", "單位所在地", "單位所屬行業", "主要業績"])
34 | 工作經歴表["主要業績字數"] = 工作經歴表.主要業績.str.len()
35 | 專業證書表 = pandas.read_csv("trainset/person_pro_cert.csv", header=0, names=["求職者編號", "專業證書名稱", "備註"])
36 | 項目經驗表 = pandas.read_csv("trainset/person_project.csv", header=0, names=["求職者編號", "項目名稱", "項目説明", "職責説明", "關鍵技術"])
37 | 崗位表 = pandas.read_csv("trainset/recruit.csv", header=0, names=["崗位編號", "招聘對象代碼", "招聘對象", "招聘職位", "對應聘者的專業要求", "崗位最低學歴", "崗位工作地點", "崗位工作年限", "具體要求"])
38 | 崗位表.招聘對象代碼 = 崗位表.招聘對象代碼.fillna(-1).astype("category")
39 | 崗位表.招聘對象 = 崗位表.招聘對象.astype("category")
40 | 崗位表.崗位最低學歴 = 崗位表.崗位最低學歴.map({"其它": 0, "中专": 1, "高中(职高、技校)": 2, "大专": 3, "大学本科": 4, "硕士研究生": 5, "博士研究生": 6, "博士后": 7})
41 | 崗位表.崗位工作年限 = 崗位表.崗位工作年限.map({"不限": -1, "应届毕业生": 0, "0至1年": 0, "1至2年": 1, "3至5年": 3, "5年以上": 5})
42 | 崗位表["具體要求字數"] = 崗位表.具體要求.str.len()
43 |
44 | 工作經歴資料表 = 工作經歴表.groupby("求職者編號").aggregate({"崗位類別": "count", "主要業績字數": ["mean", "sum"]}).reset_index()
45 | 工作經歴資料表.columns = ["求職者編號", "工作經歴數", "平均主要業績字數", "總主要業績字數"]
46 | 項目經驗資料表 = 項目經驗表.groupby("求職者編號").aggregate({"項目名稱": "count"}).reset_index()
47 | 項目經驗資料表.columns = ["求職者編號", "項目經驗數"]
48 |
49 | 訓練表 = pandas.read_csv("trainset/recruit_folder.csv", header=0, names=["崗位編號", "求職者編號", "標籤"])
50 | 測試表 = pandas.read_csv("testset/recruit_folder.csv", header=0, names=["崗位編號", "求職者編號", "標籤"])
51 |
52 | 測訓表 = pandas.concat([測試表, 訓練表], ignore_index=True)
53 | 求職者資料表 = 測訓表.groupby("求職者編號").aggregate({"崗位編號": "count"}).reset_index()
54 | 求職者資料表.columns = ["求職者編號", "求職者數"]
55 | 崗位資料表 = 測訓表.groupby("崗位編號").aggregate({"求職者編號": "count"}).reset_index()
56 | 崗位資料表.columns = ["崗位編號", "崗位數"]
57 |
58 |
59 | def 取得資料表(某表, 某特征表):
60 | 某特征求職者資料表 = 某特征表.groupby("求職者編號").aggregate({"標籤": "mean"}).reset_index()
61 | 某特征求職者資料表.columns = ["求職者編號", "求職者平均標籤"]
62 | 某特征崗位資料表 = 某特征表.groupby("崗位編號").aggregate({"標籤": "mean"}).reset_index()
63 | 某特征崗位資料表.columns = ["崗位編號", "崗位平均標籤"]
64 |
65 | 某表 = 某表.merge(求職者表, on="求職者編號", how="left")
66 | 某表 = 某表.merge(意向表, on="求職者編號", how="left")
67 | 某表 = 某表.merge(崗位表, on="崗位編號", how="left")
68 | 某表 = 某表.merge(項目經驗資料表, on="求職者編號", how="left")
69 | 某表 = 某表.merge(工作經歴資料表, on="求職者編號", how="left")
70 | 某表 = 某表.merge(求職者資料表, on="求職者編號", how="left")
71 | 某表 = 某表.merge(崗位資料表, on="崗位編號", how="left")
72 | 某表 = 某表.merge(某特征求職者資料表, on="求職者編號", how="left")
73 | 某表 = 某表.merge(某特征崗位資料表, on="崗位編號", how="left")
74 | 某表["工作地點符合否"] = (某表.工作地點 == 某表.崗位工作地點).astype("float")
75 |
76 | 某資料表 = 某表.loc[:, ["崗位編號", "求職者編號", "標籤"
77 | , "性別", "工作年限", "最高學歴", "應聘者專業", "年齡", "自薦信字數", "可到職天數"
78 | , "項目經驗數"
79 | , "工作經歴數", "平均主要業績字數", "總主要業績字數"
80 | , "招聘對象代碼", "招聘對象", "崗位最低學歴", "崗位工作年限", "具體要求字數", "工作地點符合否"
81 | , "求職者數", "崗位數"
82 | , "求職者平均標籤", "崗位平均標籤"
83 | ]]
84 | 某資料表["崗位編號特征"] = 某資料表["崗位編號"]
85 | 某資料表["求職者編號特征"] = 某資料表["求職者編號"]
86 |
87 | 某資料表 = 某資料表.loc[:, ["崗位編號", "求職者編號", "標籤"] + [子 for 子 in 某資料表.columns if 子 not in ["崗位編號", "求職者編號", "標籤"]]]
88 |
89 | return 某資料表
90 |
91 |
92 | 折數 = 4
93 | 訓練資料表 = None
94 | for 甲 in range(折數):
95 | 甲標籤表 = 訓練表[訓練表.index % 折數 == 甲].reset_index(drop=True)
96 | 甲特征表 = 訓練表[訓練表.index % 折數 != 甲].reset_index(drop=True)
97 |
98 | 甲資料表 = 取得資料表(甲標籤表, 甲特征表)
99 | 訓練資料表 = pandas.concat([訓練資料表, 甲資料表], ignore_index=True)
100 |
101 | 輕模型 = lightgbm.train(train_set=lightgbm.Dataset(訓練資料表.iloc[:, 3:], label=訓練資料表.標籤)
102 | , num_boost_round=500, params={"objective": "binary", "learning_rate": 0.03, "max_depth": 6, "num_leaves": 32, "verbose": -1, "bagging_fraction": 0.8, "feature_fraction": 0.8}
103 | )
104 |
105 | 測試資料表 = 取得資料表(測試表, 訓練表)
106 | 預測表 = 測試資料表.loc[:, ["崗位編號", "求職者編號"]]
107 | 預測表["預測打分"] = 輕模型.predict(測試資料表.iloc[:, 3:])
108 | 預測表 = 預測表.sort_values("預測打分", ascending=False, ignore_index=True)
109 | 預測表["預測"] = 0
110 | 預測表.loc[:int(0.15 * len(預測表)), ["預測"]] = 1
111 |
112 |
113 | 提交表 = 預測表.loc[:, ["崗位編號", "求職者編號", "預測"]]
114 | 提交表.columns = ["RECRUIT_ID", "PERSON_ID", "LABEL"]
115 | 提交表.to_csv("result.csv", index=False)
116 |
--------------------------------------------------------------------------------
/預測.py:
--------------------------------------------------------------------------------
1 | # python 3.9.2
2 | # python套件 lightgbm 3.1.1
3 | # python套件 numpy 1.20.1
4 | # python套件 pandas 1.2.2
5 | #
6 | # 輸入:
7 | # trainset/person.csv
8 | # trainset/person_cv.csv
9 | # trainset/person_job_hist.csv
10 | # trainset/person_pro_cert.csv
11 | # trainset/person_project.csv
12 | # trainset/recruit.csv
13 | # trainset/recruit_folder.csv
14 | # testset/recruit_folder.csv
15 | #
16 | # 輸出:
17 | # result.csv
18 | #
19 | import datetime
20 | import numpy
21 | import pandas
22 | import random
23 | import sklearn
24 | import lightgbm
25 |
26 | 求職者表 = pandas.read_csv("trainset/person.csv", header=0, names=["求職者編號", "性別", "工作年限", "最高學歴", "應聘者專業", "年齡", "最近工作崗位", "最近所在行業", "当前工作所在地", "語言能力", "專業特長"])
27 | 求職者表.性別= (求職者表.性別 == "女").astype("float")
28 | 求職者表.最高學歴 = 求職者表.最高學歴.map({"其它": 0, "中专": 1, "高中(职高、技校)": 2, "大专": 3, "大学本科": 4, "硕士研究生": 5, "博士研究生": 6, "博士后": 7})
29 | 求職者表.應聘者專業 = 求職者表.應聘者專業.str.replace("[【】]", "", regex=True).astype("category")
30 | 自薦信 = pandas.read_csv("trainset/person_cv.csv", header=0, names=["求職者編號", "自薦信", "崗位類別", "工作地點", "所在行業", "可到職天數", "其他説明"])
31 | 意向表 = pandas.read_csv("trainset/person_cv.csv", header=0, names=["求職者編號", "自薦信", "崗位類別", "工作地點", "所在行業", "可到職天數", "其他説明"])
32 | 意向表["自薦信字數"] = 意向表.自薦信.str.len()
33 | 工作經歴表 = pandas.read_csv("trainset/person_job_hist.csv", header=0, names=["求職者編號", "崗位類別", "單位所在地", "單位所屬行業", "主要業績"])
34 | 工作經歴表["主要業績字數"] = 工作經歴表.主要業績.str.len()
35 | 專業證書表 = pandas.read_csv("trainset/person_pro_cert.csv", header=0, names=["求職者編號", "專業證書名稱", "備註"])
36 | 項目經驗表 = pandas.read_csv("trainset/person_project.csv", header=0, names=["求職者編號", "項目名稱", "項目説明", "職責説明", "關鍵技術"])
37 | 崗位表 = pandas.read_csv("trainset/recruit.csv", header=0, names=["崗位編號", "招聘對象代碼", "招聘對象", "招聘職位", "對應聘者的專業要求", "崗位最低學歴", "崗位工作地點", "崗位工作年限", "具體要求"])
38 | 崗位表.招聘對象代碼 = 崗位表.招聘對象代碼.fillna(-1).astype("category")
39 | 崗位表.招聘對象 = 崗位表.招聘對象.astype("category")
40 | 崗位表.對應聘者的專業要求 = 崗位表.對應聘者的專業要求.str.replace("[【】]", "", regex=1)
41 | 崗位表.崗位最低學歴 = 崗位表.崗位最低學歴.map({"其它": 0, "中专": 1, "高中(职高、技校)": 2, "大专": 3, "大学本科": 4, "硕士研究生": 5, "博士研究生": 6, "博士后": 7})
42 | 崗位表.崗位工作年限 = 崗位表.崗位工作年限.map({"不限": -1, "应届毕业生": 0, "0至1年": 0, "1至2年": 1, "3至5年": 3, "5年以上": 5})
43 | 崗位表["具體要求字數"] = 崗位表.具體要求.str.len()
44 |
45 |
46 | 訓練表 = pandas.read_csv("trainset/recruit_folder.csv", header=0, names=["崗位編號", "求職者編號", "標籤"])
47 | 訓練表["型別"] = ((訓練表.崗位編號 > 40000000) | (訓練表.求職者編號 > 300000000)).astype("float")
48 | 測試表 = pandas.read_csv("testset/recruit_folder.csv", header=0, names=["崗位編號", "求職者編號", "標籤"])
49 | 測試表["型別"] = ((測試表.崗位編號 > 40000000) | (測試表.求職者編號 > 300000000)).astype("float")
50 | 訓練表 = pandas.concat([訓練表, 測試表.loc[測試表.型別 == 1].drop("標籤", axis=1).assign(標籤=1)], ignore_index=True)
51 |
52 | 測訓全表 = pandas.concat([測試表, 訓練表], ignore_index=True)
53 | 測訓全表 = 測訓全表.merge(求職者表, on="求職者編號")
54 | 測訓全表 = 測訓全表.merge(意向表, on="求職者編號")
55 | 測訓全表 = 測訓全表.merge(崗位表, on="崗位編號")
56 |
57 | 崗位統計表 = 測訓全表.groupby("崗位編號").aggregate({"工作年限": ["min", "max", "mean", "std"]}).reset_index()
58 | 崗位統計表.columns = ["崗位編號"
59 | , "崗位工作年限最小値", "崗位工作年限最大値", "崗位工作年限均値", "崗位工作年限標準差"
60 | ]
61 | 工作經歴統計表 = 工作經歴表.groupby("求職者編號").aggregate({"崗位類別": "count", "單位所在地": "nunique", "單位所屬行業": "nunique", "主要業績字數": ["mean", "sum"]}).reset_index()
62 | 工作經歴統計表.columns = ["求職者編號", "工作經歴數", "單位所在地數", "單位所屬行業數", "平均主要業績字數", "總主要業績字數"]
63 | 項目經驗統計表 = 項目經驗表.groupby("求職者編號").aggregate({"項目名稱": "count"}).reset_index()
64 | 項目經驗統計表.columns = ["求職者編號", "項目經驗數"]
65 | 記録數統計表 = []
66 | 記録數統計表鍵 = []
67 | 記録數特征 = []
68 | for 甲 in [["求職者編號"], ["崗位編號"]] + [[子, 丑]
69 | for 子 in ["求職者編號", "性別", "工作年限", "最高學歴", "應聘者專業", "年齡", "最近工作崗位", "最近所在行業", "語言能力", "專業特長", "崗位類別", "所在行業", "可到職天數"]
70 | for 丑 in ["崗位編號", "招聘對象代碼", "招聘對象", "招聘職位"]
71 | ] + [
72 | ["應聘者專業", "對應聘者的專業要求"], ["最高學歴", "崗位最低學歴"], ["工作年限", "崗位工作年限"], ["工作地點", "崗位工作地點"], ["当前工作所在地", "崗位工作地點"]
73 | ]:
74 | 甲統計表 = 測訓全表.groupby(甲).aggregate({"標籤": "count"}).reset_index()
75 | 甲統計表.columns = 甲 + ["%s記録數" % "".join(甲)]
76 | 記録數統計表 += [甲統計表]
77 | 記録數統計表鍵 += [甲]
78 | 記録數特征 += ["%s記録數" % "".join(甲)]
79 |
80 |
81 |
82 | def 取得資料表(某表, 某特征表):
83 | 某特征表 = 某特征表.merge(求職者表, on="求職者編號", how="left")
84 | 某特征表 = 某特征表.merge(意向表, on="求職者編號", how="left")
85 | 某特征表 = 某特征表.merge(崗位表, on="崗位編號", how="left")
86 |
87 | 某表 = 某表.merge(求職者表, on="求職者編號", how="left")
88 | 某表 = 某表.merge(意向表, on="求職者編號", how="left")
89 | 某表 = 某表.merge(崗位表, on="崗位編號", how="left")
90 |
91 | for 甲統計表, 甲統計表鍵 in zip(記録數統計表, 記録數統計表鍵):
92 | 某表 = 某表.merge(甲統計表, on=甲統計表鍵, how="left")
93 |
94 | 標籤平均値特征 = []
95 | for 甲 in \
96 | [["求職者編號"], ["應聘者專業"], ["最近工作崗位"], ["最近所在行業"], ["自薦信"]] \
97 | + [["崗位編號"], ["招聘對象代碼"], ["招聘對象"], ["招聘職位"]] \
98 | + [[子, 丑]
99 | for 子 in ["求職者編號", "性別", "工作年限", "最高學歴", "應聘者專業", "年齡", "最近工作崗位", "最近所在行業", "語言能力", "專業特長", "崗位類別", "所在行業", "可到職天數"]
100 | for 丑 in ["崗位編號", "招聘對象代碼", "招聘對象", "招聘職位"]
101 | if (子 != "求職者編號" or 丑 != "崗位編號")
102 | ] \
103 | + [["應聘者專業", "對應聘者的專業要求"], ["最高學歴", "崗位最低學歴"], ["工作年限", "崗位工作年限"], ["工作地點", "崗位工作地點"], ["当前工作所在地", "崗位工作地點"]] \
104 | :
105 | 某表 = 某表.set_index(甲)
106 | 某表[["%s標籤平均値" % "".join(甲)]] = 某特征表.groupby(甲).aggregate({"標籤": ["mean"]})
107 | 某表 = 某表.reset_index()
108 | 標籤平均値特征 += ["%s標籤平均値" % "".join(甲)]
109 |
110 | 某表["工作地點符合否"] = (某表.工作地點 == 某表.崗位工作地點).astype("float")
111 |
112 | 某資料表 = 某表.loc[:, ["崗位編號", "求職者編號", "型別", "標籤"
113 | , "性別", "年齡", "自薦信字數", "可到職天數"
114 | , "招聘對象代碼", "招聘對象", "崗位工作年限", "工作地點符合否"
115 | ] + 記録數特征 + 標籤平均値特征]
116 | 某資料表["崗位編號比求職者編號"] = 某資料表.崗位編號 / 某資料表.求職者編號
117 | 某資料表 = 某資料表.merge(項目經驗統計表, on="求職者編號", how="left")
118 | 某資料表 = 某資料表.merge(工作經歴統計表, on="求職者編號", how="left")
119 | 某資料表 = 某資料表.merge(崗位統計表, on="崗位編號", how="left")
120 |
121 | 某資料表 = 某資料表.loc[:, ["標籤", "型別", "崗位編號", "求職者編號"] + [子 for 子 in 某資料表.columns if 子 not in ["標籤", "型別", "崗位編號", "求職者編號"]]]
122 |
123 | return 某資料表
124 |
125 | 輕模型 = []
126 | for 癸 in range(0, 32):
127 | print(str(datetime.datetime.now()) + "\t開始訓練第%s箇模型!" % 癸)
128 |
129 | 折數 = int(4 + 0.125 * 癸)
130 | random.seed(1024 + 癸)
131 | 癸索引 = random.sample(range(len(訓練表)), len(訓練表))
132 | 癸訓練資料表 = None
133 | for 甲 in range(折數):
134 | 甲標籤表 = 訓練表.iloc[[癸索引[子] for 子 in range(len(訓練表)) if 子 % 折數 == 甲]].reset_index(drop=True)
135 | 甲特征表 = 訓練表.iloc[[癸索引[子] for 子 in range(len(訓練表)) if 子 % 折數 != 甲]].reset_index(drop=True)
136 |
137 | 甲資料表 = 取得資料表(甲標籤表.loc[甲標籤表.型別 == 0], 甲特征表)
138 | 癸訓練資料表 = pandas.concat([癸訓練資料表, 甲資料表], ignore_index=True)
139 |
140 | 癸訓練資料表.loc[癸訓練資料表.型別 == 1, ["求職者編號", "崗位編號"]] = numpy.nan
141 | 輕模型 += [lightgbm.train(
142 | train_set=lightgbm.Dataset(癸訓練資料表.iloc[:, 2:], label=癸訓練資料表.標籤)
143 | , num_boost_round=512 + (癸 % 4) * 128, params={"objective": "binary", "learning_rate": 0.03, "max_depth": 6, "num_leaves": 32, "verbose": -1, "bagging_fraction": 0.7, "feature_fraction": 0.7}
144 | )]
145 |
146 |
147 | 測試資料表 = 取得資料表(測試表.loc[測試表.型別 == 0].reset_index(drop=True), 訓練表.copy())
148 | 預測表 = 測試資料表.loc[:, ["崗位編號", "求職者編號"]]
149 | 預測表["預測打分"] = numpy.mean([輕模型[子].predict(測試資料表.iloc[:, 2:]) for 子 in range(len(輕模型))], axis=0)
150 |
151 | 預測表 = 預測表.sort_values("預測打分", ascending=False, ignore_index=True)
152 | 預測表["預測"] = 0
153 | 預測表.loc[:int(0.075 * len(預測表)), ["預測"]] = 1
154 | 預測表 = pandas.concat([
155 | 預測表
156 | , 測試表.loc[測試表.型別 == 1, ["崗位編號", "求職者編號"]].assign(預測=1, 預測打分=1)
157 | ], ignore_index=True)
158 |
159 | 提交表 = 預測表.loc[:, ["崗位編號", "求職者編號", "預測"]]
160 | 提交表.columns = ["RECRUIT_ID", "PERSON_ID", "LABEL"]
161 | 提交表.to_csv("result.csv", index=False)
162 |
--------------------------------------------------------------------------------