├── 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 | --------------------------------------------------------------------------------