随机森林调节参数

原文https://www.jianshu.com/p/27b2ef36a182

这里简要介绍下这个题目的注意事项:

  1. 多分类。为每个类输出相应类的概率
  2. 评估的时候使用的是multi-class log loss

特征工程

无疑,当前使用的是最原始的特征。我们并未对特征进行一定的调整,而是粗暴的直接拿来使用。

目前特征分成以下几类:

  • 时间类,包括月份、天、时、具体星期几
  • 地址类,包括经纬度以及所在辖区

Baseline Model

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn import linear_model
from sklearn import metrics
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV



targets = ['ARSON', 'ASSAULT', 'BAD CHECKS', 'BRIBERY', 'BURGLARY',
     'DISORDERLY CONDUCT', 'DRIVING UNDER THE INFLUENCE', 'DRUG/NARCOTIC',
     'DRUNKENNESS', 'EMBEZZLEMENT', 'EXTORTION', 'FAMILY OFFENSES',
     'FORGERY/COUNTERFEITING', 'FRAUD', 'GAMBLING', 'KIDNAPPING',
     'LARCENY/THEFT', 'LIQUOR LAWS', 'LOITERING', 'MISSING PERSON',
     'NON-CRIMINAL', 'OTHER OFFENSES', 'PORNOGRAPHY/OBSCENE MAT',
     'PROSTITUTION', 'RECOVERED VEHICLE', 'ROBBERY', 'RUNAWAY',
     'SECONDARY CODES', 'SEX OFFENSES FORCIBLE', 'SEX OFFENSES NON FORCIBLE',
     'STOLEN PROPERTY', 'SUICIDE', 'SUSPICIOUS OCC', 'TREA', 'TRESPASS',
     'VANDALISM', 'VEHICLE THEFT', 'WARRANTS', 'WEAPON LAWS']

def feature_engineer(data):
  data["Month"] = data["Dates"].map(lambda x: int(x[5:7]))
  data["Day"] = data["Dates"].map(lambda x:int(x[8:10]))
  data["Hour"] = data["Dates"].map(lambda x:int(x[11:13]))
  data["District_No"] = data["PdDistrict"].map(lambda x:districts[x])
  data["Weekday"] = data["DayOfWeek"].map(lambda x:weekdays[x])
  return data



train = pd.read_csv("/Users/maodou/Desktop/crimeclass/train.csv")
test = pd.read_csv("/Users/maodou/Desktop/crimeclass/test.csv")
districts = {c:i for i,c in enumerate(train['PdDistrict'].unique())}
weekdays = {c:i for i,c in enumerate(train['DayOfWeek'].unique())}

train = feature_engineer(train)
train["targets"] = train["Category"].map(lambda x:targets.index(x))
test = feature_engineer(test)

X_all = ["Month", "Day", "Hour", "Weekday", "District_No", "X", "Y"]

forest = RandomForestClassifier(n_estimators=100).fit(train[X_all],train['targets'])
result = forest.predict_proba(test[X_all])

submission = pd.DataFrame({targets[p] : [result[i][p] for i in range(len(result))] for p in range(len(result[0]))})

submission['Id'] = [i for i in range(len(submission))]

submission.to_csv("submission_idx_baseline_tuning.csv.gz", index=False, compression='gzip')

这个模型结果3.8分。不够好。下面将优化。

Baseline代码中的几个Tricks

  1. 从最终predict出来的矩阵转到submission中的multi-class的DataFrame
submission = pd.DataFrame({targets[p] : [result[i][p] for i in range(len(result))] for p in range(len(result[0]))})

一句话初始化转换。
如果使用多重for循环,先默认初始化再复制的形式,会导致运行时间大大增长

  1. 单独定义feature_engineer函数,避免混乱的train和test同时变换
  2. 通过选择train中的指定列来定义训练数据,避免重新构造新的data frame。直接train[X_selected]即可只选择X_selected中选定的列数组

调参

RandomForest调参

RandomForest大部分参数使用默认的参数即可。涉及到调参的主要是以下几个:

  • n_estimators : 森林中树的个数, 一般来说树的个数越多越好。故该参数应该设置成能设置的最大值,不需要重新搜索
  • max_depth : 树的深度 一般设置为10到100之间
  • min_samples_split : 向下继续分支的最小样本数
  • max_features : 每颗树使用的特征数(log2, sqrt(auto), 等)

使用GridSearchCV来搜索最佳值

params = {"max_features":("log2", "sqrt")}

gsearch = GridSearchCV(estimator=RandomForestClassifier(n_estimators=100, max_depth=10, min_samples_split=100), param_grid = params, scoring = "neg_log_loss")
gsearch.fit(train[X_all], train["targets"])

print(gsearch.grid_scores_)

print("best params")

print(gsearch.best_params_)

print("best scores")

print(gsearch.best_score_)

这样逐个确认最佳参数。局部最优值不代表全局,可目前只能用这个方法啦。

最终使用参数如下:

  forest = RandomForestClassifier(n_estimators=100, max_depth=10, min_samples_split=100, max_features="log2", oob_score=True).fit(train[X_all],train['targets'])

得分2.4 , 大大提高了排名。

对比

优化点Score
RF默认3.84746
不使用街角特征2.43471
不变换经度纬度&不使用街角特征2.4061
不变换经度纬度&不使用街角特征&不变换Hour2.40072

使用KNN进行预测

主体代码一样,关键代码如下:

knn = KNeighborsClassifier(n_neighbors = 4, weights = 'uniform').fit(train[X_all], train["targets"])
result = knn.predict_proba(test[X_all])

最终效果,得分21.48253。

简直不可接受啊!!!!

现在进行调参。

这个n_neighbors参数很多文章说使用3到5就行了。但经试验,发现这个值会对模型结果影响特别大。

params = {"n_neighbors": range(100 , 801, 100)}

gsearch = GridSearchCV(estimator=KNeighborsClassifier( weights = 'uniform'), param_grid = params , scoring = "neg_log_loss")

gsearch.fit(train[X_all], train["targets"])

print(gsearch.grid_scores_)

print("best params")

print(gsearch.best_params_)

print("best scores")

print(gsearch.best_score_)

在该实验中,发现n_neighbors取到800能达到更好的效果。public score能到2.77分。目前该值还是越大越好。因为本人电脑性能问题,暂不对n_neighbors的最优值进行探索

通过对KNN和RF的对比可以发现,使用不同的算法,很可能会大大影响到找到使模型快速收敛到最佳状态的参数



作者:墨家钜子
链接:https://www.jianshu.com/p/27b2ef36a182
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
Matlab中的随机森林模型有许多可调节的超参数,下面是一些常见的超参数及其含义: 1. NumTrees:指定森林中树的数量。通常情况下,树的数量越多,模型的性能会越好,但是训练时间也会变长。 2. Method:选择用于构建决策树的算法。默认值为'分类树',可选值为'回归树'和'FineTree'。 3. MaxNumSplits:指定每个节点最大分裂次数。一般情况下,该值越大,模型的复杂度越高,但是过大的值可能会导致过拟合。 4. MinLeafSize:指定每个叶子节点的最小样本数。一般情况下,该值越小,模型的复杂度越高,但是过小的值可能会导致过拟合。 5. MinParentSize:指定每个非叶子节点的最小样本数。一般情况下,该值越小,模型的复杂度越高,但是过小的值可能会导致过拟合。 6. NumVariablesToSample:指定每个节点在分裂时随机选择的特征数量。一般情况下,该值越小,模型的复杂度越低,但是过小的值可能会导致欠拟合。 7. Prior:指定类别先验概率。默认情况下,该值为'empirical',表示使用训练数据中各个类别的频率作为先验概率。 8. Cost:指定分类错误时的代价矩阵。 9. SampleWithReplacement:指定是否使用有放回抽样。 10. Surrogate:指定是否使用代理分裂。 11. MergeLeaves:指定是否合并叶子节点。 这些超参数的最佳取值通常需要通过交叉验证等方法进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值