阿里云天池机器学习训练营task2

XGBoost介绍
xgboost有听说过,也在kaggle上经常看到有人用。关于原理这方面,网络上大都只有应用的资料,关于原理的很少,通俗来讲,xgboost属于梯度提升树(GBDT)模型的范畴,GBDT的基本思想是让n层模型去拟合n-1层模型的偏差,从而不断使加法模型的偏差降低。相比于GBDT,xgboost做了一些改进,从而在效果和性能上有明显的提升。本节我们的重点还是放在实战应用上。

基于天气数据集的XGBoost分类实战
#代码是在DSW上运行,首先下载天池提供的天气数据集
!wget https://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/7XGBoost/train.csv
1
2
#读取数据并简略查看
import pandas as pd
data = pd.read_csv('train.csv')
data.head(5)
#可以看到train数据集中每一条数据有23个特征值
1
2
3
4
5

可以看到数据是某天的天气状况,其中RainTomorrow属于预测label

特征名称    意义    取值范围
Date    日期    字符串
Location    气象站的地址    字符串
MinTemp    最低温度    实数
MaxTemp    最高温度    实数
Rainfall    降雨量    实数
Evaporation    蒸发量    实数
Sunshine    光照时间    实数
WindGustDir    最强的风的方向    字符串
WindGustSpeed    最强的风的速度    实数
WindDir9am    早上9点的风向    字符串
WindDir3pm    下午3点的风向    字符串
WindSpeed9am    早上9点的风速    实数
WindSpeed3pm    下午3点的风速    实数
Humidity9am    早上9点的湿度    实数
Humidity3pm    下午3点的湿度    实数
Pressure9am    早上9点的大气压    实数
Pressure3pm    早上3点的大气压    实数
Cloud9am    早上9点的云指数    实数
Cloud3pm    早上3点的云指数    实数
Temp9am    早上9点的温度    实数
Temp3pm    早上3点的温度    实数
RainToday    今天是否下雨    No,Yes
RainTomorrow    明天是否下雨    No,Yes
#对于缺省值,用-1填充
data = data.fillna(-1)
1
2
#查看数据集中label的分布情况
pd.Series(data['RainTomorrow']).value_counts()
#可以看到负样本的数量是要大于正样本,不平衡
1
2
3


#将数字value和非数字value分别存储
numerical_features = [x for x in data.columns if data[x].dtype == np.float]
category_features = [x for x in data.columns if data[x].dtype != np.float and x != 'RainTomorrow']
1
2
3
#选取降雨量、蒸发量、光照时间以明日是否降雨进行分类并绘制散点图
sns.pairplot(data=data[['Rainfall','Evaporation','Sunshine'] + 
                        ['RainTomorrow']], diag_kind='hist', hue= 'RainTomorrow')
plt.show()
1
2
3
4

从上图可以发现,在2D情况下不同的特征组合对于第二天下雨与不下雨的散点分布,以及大概的区分能力。相对的Sunshine与其他特征的组合更具有区分能力

for col in data[numerical_features].columns:
    if col != 'RainTomorrow':
        sns.boxplot(x='RainTomorrow', y=col, saturation=0.5, palette='pastel', data=data)
        plt.title(col)
        plt.show()
1
2
3
4
5

利用箱型图我们也可以得到不同类别在不同特征上的分布差异情况。我们可以发现Sunshine,Humidity3pm,Cloud9am,Cloud3pm的区分能力较强

#用tlog和flog统计明日是否降雨的所有value的分布情况
tlog = {}
for i in category_features:
    tlog[i] = data[data['RainTomorrow'] == 'Yes'][i].value_counts()
flog = {}
for i in category_features:
    flog[i] = data[data['RainTomorrow'] == 'No'][i].value_counts()
1
2
3
4
5
6
7
如tolg中Location项存储所有地区出现raintomorrow的次数情况


#绘制降雨和不降雨两幅图,以地区为分类条件
plt.figure(figsize=(10,10))
plt.subplot(1,2,1)
plt.title('RainTomorrow')
sns.barplot(x = pd.DataFrame(tlog['Location']).sort_index()['Location'], y = pd.DataFrame(tlog['Location']).sort_index().index, color = "red")
plt.subplot(1,2,2)
plt.title('Not RainTomorrow')
sns.barplot(x = pd.DataFrame(flog['Location']).sort_index()['Location'], y = pd.DataFrame(flog['Location']).sort_index().index, color = "blue")
plt.show()
1
2
3
4
5
6
7
8
9

从上图可以发现不同地区降雨情况差别很大,有些地方明显更容易降雨

#分析raintoday对raintomorrow的影响
plt.figure(figsize=(10,2))
plt.subplot(1,2,1)
plt.title('RainTomorrow')
sns.barplot(x = pd.DataFrame(tlog['RainToday'][:2]).sort_index()['RainToday'], y = pd.DataFrame(tlog['RainToday'][:2]).sort_index().index, color = "red")
plt.subplot(1,2,2)
plt.title('Not RainTomorrow')
sns.barplot(x = pd.DataFrame(flog['RainToday'][:2]).sort_index()['RainToday'], y = pd.DataFrame(flog['RainToday'][:2]).sort_index().index, color = "blue")
plt.show()
1
2
3
4
5
6
7
8
9

两图分别代表today下雨的yes or no对raintomorrow下雨的影响,图一看出今天下雨并不会对明天下雨有影响,但是今天天晴,明天大概率天气为晴

# 把所有的相同类别的特征编码为同一个值
def get_mapfunction(x):
    mapp = dict(zip(x.unique().tolist(),
         range(len(x.unique().tolist()))))
    def mapfunction(y):
        if y in mapp:
            return mapp[y]
        else:
            return -1
    return mapfunction
for i in category_features:#非数字value编码
    data[i] = data[i].apply(get_mapfunction(data[i]))
1
2
3
4
5
6
7
8
9
10
11
12
data['Location'].unique()
#例如Location被从0到48进行编码,转化成数字类型
1
2


from sklearn.model_selection import train_test_split
data_target_part = data['RainTomorrow']#预测label提出
data_features_part = data[[x for x in data.columns if x != 'RainTomorrow']]#除去label的data作为train的数据
x_train, x_test, y_train, y_test = train_test_split(data_features_part, data_target_part, test_size = 0.2, random_state = 2021)
#训练集和测试集4:1划分
1
2
3
4
5
#导入模型并对traindata和trainlabel进行拟合
from xgboost.sklearn import XGBClassifier
clf = XGBClassifier()
clf.fit(x_train, y_train)
1
2
3
4
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
#对x_train进行回测正确率0.85,在划分的x_test测试正确率0.84
1
2
3


#我们可以通过查看模型的参数观察不同feature的权重
sns.barplot(y=data_features_part.columns, x=clf.feature_importances_)
#如下图,所有feature中,最为突出的为下午三点湿度和今日是否下雨,这两个也是影响明日降雨的最关键因素
1
2
3

另外对于model的调参,使用GridSearchCV寻找最佳参数或是手动调参都是可以的。
XGBoost中包括但不限于下列对模型影响较大的参数:

learning_rate: 有时也叫作eta,系统默认值为0.3。每一步迭代的步长,很重要。太大了运行准确率不高,太小了运行速度慢。
subsample:系统默认为1。这个参数控制对于每棵树,随机采样的比例。减小这个参数的值,算法会更加保守,避免过拟合, 取值范围零到一。
colsample_bytree:系统默认值为1。我们一般设置成0.8左右。用来控制每棵随机采样的列数的占比(每一列是一个特征)。
max_depth: 系统默认值为6,我们常用3-10之间的数字。这个值为树的最大深度。这个值是用来控制过拟合的。max_depth越大,模型学习的更加具体。
#下面举例,对四个参数分别选取可能的最优结果并存储到para字典,传入GridSearchCV进行三次cv验证得到最优参数的clf
from sklearn.model_selection import GridSearchCV
learning_rate = [0.1, 0.3, 0.6]
subsample = [0.8, 0.9]
colsample_bytree = [0.6, 0.8]
max_depth = [3,5,8]
parameters = { 'learning_rate': learning_rate,
              'subsample': subsample,
              'colsample_bytree':colsample_bytree,
              'max_depth': max_depth}
model = XGBClassifier(n_estimators = 50)
clf = GridSearchCV(model, parameters, cv=3, scoring='accuracy',verbose=1,n_jobs=-1)
clf = clf.fit(x_train, y_train)
1
2
3
4
5
6
7
8
9
10
11
12
13
clf.best_params_
#如本次参数选取了如下图所示为最优
1
2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 阿里云天池大赛是一个非常有名的数据科学竞赛平台,其中机器学习竞赛是其中的一个重要组成部分。在这个竞赛中,参赛者需要使用机器学习算法来解决各种各样的问题,例如图像识别、自然语言处理、推荐系统等等。 机器学习竞赛的解题过程通常包括以下几个步骤: 1. 数据预处理:参赛者需要对提供的数据进行清洗、特征提取、数据转换等操作,以便于后续的建模和训练。 2. 模型选择:参赛者需要选择适合当前问题的机器学习算法,并对其进行调参和优化。 3. 模型训练:参赛者需要使用训练数据对模型进行训练,并对训练过程进行监控和调整。 4. 模型评估:参赛者需要使用测试数据对模型进行评估,以确定其在实际应用中的性能表现。 5. 结果提交:参赛者需要将最终的模型结果提交到竞赛平台上进行评估和排名。 在机器学习竞赛中,成功的关键在于对问题的深入理解和对机器学习算法的熟练掌握。同时,参赛者还需要具备良好的团队合作能力和沟通能力,以便于在竞赛中取得更好的成绩。 ### 回答2: 阿里云天池大赛是一个非常受欢迎的机器学习竞赛平台,它汇集了大量来自世界各地的数据科学家,分享了一系列有趣的竞赛和可用的数据集,供参赛选手使用。机器学习篇中,我们将解析一些常见的阿里云天池大赛题目,让大家对机器学习竞赛有更深入的了解。 一、赛题选取 阿里云天池大赛的赛题通常与商业、医疗等复杂领域相关,选择数据集时要了解行业背景和数据质量,以准确地判断模型的准确性和适用性。此外,在选择赛题时,还要考虑与参赛选手一起合作的可能性,以及他们可能使用的算法和技术。因此,为了成功解决赛题,参赛者应当仔细研究题目的背景、数据、分析目标等内容,有助于更好地理解问题及其解决方案。 二、数据清洗 参赛者在使用数据时,需要对其进行实质性的预处理和清洗工作,以减少不准确的数据对结果的影响。预处理和清洗包括基本的数据处理,例如缺失值、异常值和重复值的处理,还需要利用可视化和探索性数据分析等技术来检查数据的分布情况、相互关系和异常值等问题。 三、特征选择 在构建模型之前,参赛选手必须确定哪些特征会对问题的解决产生实际影响。这个过程称为特征选择,它旨在通过保留最相关的特征来减少模型复杂性,提高准确性,并且还有助于减少数据集的维数。特征选择包括基于统计学和机器学习的算法,同时应该考虑特征的相关性和重要性。 四、建模和评估 参赛者在解决问题时,需要考虑使用何种算法,以及如何构建对应的模型。此外,还需在不同的算法和模型之间进行比较,并选择最优模型。最后,应该针对模型进行评估,以确保各种重要性能指标(例如准确性,召回率,精确度等)都得到最佳表现。 总的来说,机器学习是一种复杂而令人兴奋的技术,参赛者要考虑数据质量、数据清洗、特征选择、建模和评估等诸多因素。通过参加阿里云天池大赛,大家可以不断学习和练习,不仅提升自己的技能,同时还有机会获得丰厚的奖励。 ### 回答3: 阿里云天池大赛是一个集数据竞赛、人才选拔、行业交流、技术分享、产学研合作等多种功能于一体的大型平台。其中,机器学习篇的赛题挑战包括了各种典型机器学习场景,旨在挖掘数据中价值,提高数据应用和解决实际问题的能力。 在机器学习篇的赛题中,常见的任务包括分类、回归、聚类、推荐等,其中分类问题是最常见的任务之一。分类可以分为二分类、多分类、超大规模分类等多个子类型。对于分类问题,大家需要学习分类算法,如KNN、NB、SVM、LR、GBDT、XGBoost等,并熟悉如何调参等技巧。 回归问题主要是根据给定的样本数据,预测一个连续的数值。回归问题旨在找到独立变量(X)和连续依赖变量(Y)之间的关系,以便使用该模型来预测连续依赖变量的值。对于回归问题,大家需要掌握线性回归、岭回归、Lasso回归、ElasticNet回归等算法。 聚类问题是将相似的数据划分到同一类别中,相似度较高,不同类别之间相似度较低。对于聚类问题,大家需要学习如何使用K-means、DBSCAN、Hierarchical聚类算法。 推荐问题是根据用户的行为习惯,预测用户的需求,以便将相应的内容推荐给用户。推荐问题的数据通常包括用户的行为、物品的属性和用户的评分。推荐问题常用的算法包括CF、ALS、LFM等。除此之外,还有深度学习在图像识别、语音识别、自然语言处理、推荐、游戏AI等方面具有广泛的应用,如CNN、RNN、LSTM、GAN等。 总之,机器学习篇的赛题挑战涉及到各种典型机器学习算法和应用场景,需要大家掌握基础理论和实践技巧,并多参加实战项目和比赛练习,不断提升自己的能力和水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值