数据分析实战45讲
陈旸
清华大学计算机博士
立即订阅
17170 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要数据分析能力?
免费
第一模块:数据分析基础篇 (16讲)
01丨数据分析全景图及修炼指南
02丨学习数据挖掘的最佳路径是什么?
03丨Python基础语法:开始你的Python之旅
04丨Python科学计算:用NumPy快速处理数据
05丨Python科学计算:Pandas
06 | 学数据分析要掌握哪些基本概念?
07 | 用户画像:标签化就是数据的抽象能力
08 | 数据采集:如何自动化采集数据?
09丨数据采集:如何用八爪鱼采集微博上的“D&G”评论
10丨Python爬虫:如何自动化下载王祖贤海报?
11 | 数据科学家80%时间都花费在了这些清洗任务上?
免费
12 | 数据集成:这些大号一共20亿粉丝?
13 | 数据变换:考试成绩要求正态分布合理么?
14丨数据可视化:掌握数据领域的万金油技能
15丨一次学会Python数据可视化的10种技能
16丨数据分析基础篇答疑
第二模块:数据分析算法篇 (20讲)
17 丨决策树(上):要不要去打篮球?决策树来告诉你
18丨决策树(中):CART,一棵是回归树,另一棵是分类树
19丨决策树(下):泰坦尼克乘客生存预测
20丨朴素贝叶斯分类(上):如何让机器判断男女?
21丨朴素贝叶斯分类(下):如何对文档进行分类?
22丨SVM(上):如何用一根棍子将蓝红两色球分开?
23丨SVM(下):如何进行乳腺癌检测?
24丨KNN(上):如何根据打斗和接吻次数来划分电影类型?
25丨KNN(下):如何对手写数字进行识别?
26丨K-Means(上):如何给20支亚洲球队做聚类?
27丨K-Means(下):如何使用K-Means对图像进行分割?
28丨EM聚类(上):如何将一份菜等分给两个人?
29丨EM聚类(下):用EM算法对王者荣耀英雄进行划分
30丨关联规则挖掘(上):如何用Apriori发现用户购物规则?
31丨关联规则挖掘(下):导演如何选择演员?
32丨PageRank(上):搞懂Google的PageRank算法
33丨PageRank(下):分析希拉里邮件中的人物关系
34丨AdaBoost(上):如何使用AdaBoost提升分类器性能?
35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?
36丨数据分析算法篇答疑
第三模块:数据分析实战篇 (7讲)
37丨数据采集实战:如何自动化运营微博?
38丨数据可视化实战:如何给毛不易的歌曲做词云展示?
39丨数据挖掘实战(1):信用卡违约率分析
40丨数据挖掘实战(2):信用卡诈骗分析
41丨数据挖掘实战(3):如何对比特币走势进行预测?
42丨当我们谈深度学习的时候,我们都在谈什么?
43丨深度学习(下):如何用Keras搭建深度学习网络做手写数字识别?
第四模块:数据分析工作篇 (2讲)
44丨如何培养你的数据分析思维?
45丨求职简历中没有相关项目经验,怎么办?
加餐 (1讲)
加餐丨在社交网络上刷粉刷量,技术上是如何实现的?
结束语 (1讲)
结束语丨当大家都在讲知识和工具的时候,我更希望你重视思维和实战
数据分析实战45讲
登录|注册

35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?

陈旸 2019-03-04
今天我带你用 AdaBoost 算法做一个实战项目。AdaBoost 不仅可以用于分类问题,还可以用于回归分析。
我们先做个简单回忆,什么是分类,什么是回归呢?实际上分类和回归的本质是一样的,都是对未知事物做预测。不同之处在于输出结果的类型,分类输出的是一个离散值,因为物体的分类数有限的,而回归输出的是连续值,也就是在一个区间范围内任何取值都有可能。
这次我们的主要目标是使用 AdaBoost 预测房价,这是一个回归问题。除了对项目进行编码实战外,我希望你能掌握:
AdaBoost 工具的使用,包括使用 AdaBoost 进行分类,以及回归分析。
使用其他的回归工具,比如决策树回归,对比 AdaBoost 回归和决策树回归的结果。

如何使用 AdaBoost 工具

我们可以直接在 sklearn 中使用 AdaBoost。如果我们要用 AdaBoost 进行分类,需要在使用前引用代码:
from sklearn.ensemble import AdaBoostClassifier
我们之前讲到过,如果你看到了 Classifier 这个类,一般都会对应着 Regressor 类。AdaBoost 也不例外,回归工具包的引用代码如下:
from sklearn.ensemble import AdaBoostRegressor
我们先看下如何在 sklearn 中创建 AdaBoost 分类器。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据分析实战45讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(12)

  • Destroy、
    源代码中:
    # 从 12000 个数据中取前 2000 行作为测试集,其余作为训练集
    test_x, test_y = X[2000:],y[2000:]
    train_x, train_y = X[:2000],y[:2000]

    这个部分的代码写错了吧
    应该是:
    test_x, test_y = x[: 2000], y[: 2000]
    train_x, train_y = x[2000:], y[2000:]

    编辑回复: 您好,文章已进行更正,谢谢您的反馈。

    2019-03-05
    11
  • third
    结果仍然为AdaBoost算法最优。
    个人发现,前两个分类器出结果很快
    分析最优:
    1.AdaBoost算法经过了更多运算,特别是在迭代弱分类器和组合上
    2.良好组合起来的个体,能够创造更大的价值。

    决策树弱分类器准确率为 0.7867
    决策树分类器准确率为 0.7891
    AdaBoost 分类器准确率为 0.8138

    import numpy as np
    import pandas as pd
    from sklearn.model_selection import cross_val_score
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import AdaBoostClassifier
    from sklearn.feature_extraction import DictVectorizer

    # 1.数据加载
    train_data=pd.read_csv('./Titanic_Data/train.csv')
    test_data=pd.read_csv('./Titanic_Data/test.csv')

    # 2.数据清洗
    # 使用平均年龄来填充年龄中的 NaN 值
    train_data['Age'].fillna(train_data['Age'].mean(),inplace=True)
    test_data['Age'].fillna(test_data['Age'].mean(),inplace=True)
    # 均价填充
    train_data['Fare'].fillna(train_data['Fare'].mean(),inplace=True)
    test_data['Fare'].fillna(test_data['Fare'].mean(),inplace=True)
    # 使用登陆最多的港口来填充
    train_data['Embarked'].fillna('S',inplace=True)
    test_data['Embarked'].fillna('S',inplace=True)

    # 特征选择
    features=['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked']
    train_features=train_data[features]
    train_labels=train_data['Survived']
    test_features=test_data[features]

    # 将符号化的Embarked对象抽象处理成0/1进行表示
    dvec=DictVectorizer(sparse=False)
    train_features=dvec.fit_transform(train_features.to_dict(orient='record'))
    test_features=dvec.transform(test_features.to_dict(orient='record'))

    # 决策树弱分类器
    dt_stump = DecisionTreeClassifier(max_depth=1,min_samples_leaf=1)
    dt_stump.fit(train_features, train_labels)

    print(u'决策树弱分类器准确率为 %.4lf' % np.mean(cross_val_score(dt_stump, train_features, train_labels, cv=10)))

    # 决策树分类器
    dt = DecisionTreeClassifier()
    dt.fit(train_features, train_labels)

    print(u'决策树分类器准确率为 %.4lf' % np.mean(cross_val_score(dt, train_features, train_labels, cv=10)))

    # AdaBoost 分类器
    ada = AdaBoostClassifier(base_estimator=dt_stump,n_estimators=200)
    ada.fit(train_features, train_labels)

    print(u'AdaBoost 分类器准确率为 %.4lf' % np.mean(cross_val_score(ada, train_features, train_labels, cv=10)))

    编辑回复: 结果正确,一般来说AdaBoost的结果会比决策树分类器略好一些。

    2019-03-04
    4
  • 王彬成
    由于乘客测试集缺失真实值,采用 K 折交叉验证准确率
    --------------------
    运行结果:
    决策树弱分类器准确率为 0.7867
    决策树分类器准确率为 0.7813
    AdaBoost 分类器准确率为 0.8138
    -------------------------
    代码:
    import numpy as np
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import AdaBoostClassifier
    import pandas as pd
    from sklearn.feature_extraction import DictVectorizer
    from sklearn.model_selection import cross_val_score

    # 设置 AdaBoost 迭代次数
    n_estimators=200

    # 数据加载
    train_data=pd.read_csv('./Titanic_Data/train.csv')
    test_data=pd.read_csv('./Titanic_Data/test.csv')

    # 模块 2:数据清洗
    # 使用平均年龄来填充年龄中的 NaN 值
    train_data['Age'].fillna(train_data['Age'].mean(),inplace=True)
    test_data['Age'].fillna(test_data['Age'].mean(),inplace=True)
    # 使用票价的均值填充票价中的 nan 值
    train_data['Fare'].fillna(train_data['Fare'].mean(),inplace=True)
    test_data['Fare'].fillna(test_data['Fare'].mean(),inplace=True)
    # 使用登录最多的港口来填充登录港口Embarked的 nan 值
    train_data['Embarked'].fillna('S',inplace=True)
    test_data['Embarked'].fillna('S',inplace=True)

    # 特征选择
    features=['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked']
    train_features=train_data[features]
    train_labels=train_data['Survived']
    test_features=test_data[features]

    # 将符号化的Embarked对象处理成0/1进行表示
    dvec=DictVectorizer(sparse=False)
    train_features=dvec.fit_transform(train_features.to_dict(orient='record'))
    test_features=dvec.transform(test_features.to_dict(orient='record'))

    # 决策树弱分类器
    dt_stump = DecisionTreeClassifier(max_depth=1,min_samples_leaf=1)
    dt_stump.fit(train_features, train_labels)

    print(u'决策树弱分类器准确率为 %.4lf' % np.mean(cross_val_score(dt_stump, train_features, train_labels, cv=10)))

    # 决策树分类器
    dt = DecisionTreeClassifier()
    dt.fit(train_features, train_labels)

    print(u'决策树分类器准确率为 %.4lf' % np.mean(cross_val_score(dt, train_features, train_labels, cv=10)))

    # AdaBoost 分类器
    ada = AdaBoostClassifier(base_estimator=dt_stump,n_estimators=n_estimators)
    ada.fit(train_features, train_labels)

    print(u'AdaBoost 分类器准确率为 %.4lf' % np.mean(cross_val_score(ada, train_features, train_labels, cv=10)))
    2019-03-04
    2
  • 梁林松
    跑第二块代码是需要引入两个模块
    from sklearn.tree import DecisionTreeRegressor
    from sklearn.neighbors import KNeighborsRegressor

    编辑回复: 对的 需要引入相应的回归类库。

    2019-03-04
    1
  • 骑行的掌柜J
    打错了 陈老师是对的 是回归算法😂里没有分类算法的algorithm 参数。
    2019-08-14
  • 得到结果:
    CART决策树K折交叉验证准确率: 0.39480897860892333
    AdaBoostK折交叉验证准确率: 0.4376641797318339

    from sklearn.tree import DecisionTreeRegressor
    from sklearn.ensemble import AdaBoostRegressor
    from sklearn.feature_extraction import DictVectorizer
    from sklearn.model_selection import cross_val_predict
    import pandas as pd
    import numpy as np

    #读取数据
    path = '/Users/apple/Desktop/GitHubProject/Read mark/数据分析/geekTime/data/'
    train_data = pd.read_csv(path + 'Titannic_Data_train.csv')
    test_data = pd.read_csv(path + 'Titannic_Data_test.csv')

    #数据清洗
    train_data['Age'].fillna(train_data['Age'].mean(),inplace=True)
    test_data['Age'].fillna(test_data['Age'].mean(), inplace=True)
    train_data['Embarked'].fillna('S', inplace=True)
    test_data['Embarked'].fillna('S', inplace=True)

    #特征选择
    features = ['Pclass','Sex','Age','SibSp','Parch','Embarked']
    train_features = train_data[features]
    train_result = train_data['Survived']
    test_features = test_data[features]
    devc = DictVectorizer(sparse=False)
    train_features = devc.fit_transform(train_features.to_dict(orient='record'))
    test_features = devc.fit_transform(test_features.to_dict(orient='record'))

    #构造决策树,进行预测
    tree_regressor = DecisionTreeRegressor()
    tree_regressor.fit(train_features,train_result)
    predict_tree = tree_regressor.predict(test_features)
    #交叉验证准确率
    print('CART决策树K折交叉验证准确率:', np.mean(cross_val_predict(tree_regressor,train_features,train_result,cv=10)))

    #构造AdaBoost
    ada_regressor = AdaBoostRegressor()
    ada_regressor.fit(train_features,train_result)
    predict_ada = ada_regressor.predict(test_features)
    #交叉验证准确率
    print('AdaBoostK折交叉验证准确率:',np.mean(cross_val_predict(ada_regressor,train_features,train_result,cv=10)))

    编辑回复: 准确率一般不会这么低,所以你可以查下代码中是否有错误。
    这里需要注意的是,应该是用DecisionTreeClassifier和AdaBoostClassifier,因为泰坦尼克生存预测是个分类问题(离散值),不是回归问题(连续值)。
    另外在我们在做K折交叉验证的时候,应该使用:cross_val_score
    cross_val_score 用来返回评测的准确率
    cross_val_predict 用来返回预测的分类结果
    这两处地方你调整下,再跑跑代码

    2019-04-21
  • 滨滨
    分类和回归都是做预测,分类是离散值,回归是连续值
    2019-04-21
  • hlz-123
    老师,在AdaBoost 与决策树模型的比较的例子中,弱分类器
    dt_stump = DecisionTreeClassfier(max_depth=1,min_samples_leaf=1)
    为什么两个参数都设置为1,相当于只有1个根节点,2个叶节点?
    而普通的决策树分类器,没有设置参数,这是什么原因?
    2019-03-27
  • 叮当猫
    fit_transform数据统一处理,求问什么时候需要?
    在我同时没有进行fit_transform的情况下,准确率:
    决策树弱分类器的准确率是0.7867
    决策树分类器的准确率是0.7734
    AdaBoost分类器的准确率是0.8161
    在我对数据同时进行fit_transform的情况下,准确率:
    决策树弱分类器的准确率是0.7867
    决策树分类器的准确率是0.7745
    AdaBoost分类器的准确率是0.8138

    以下是第一种情况:
    train_data['Embarked'] = train_data['Embarked'].map({'S':0, 'C':1, 'Q':2})
    test_data['Embarked'] = test_data['Embarked'].map({'S':0, 'C':1, 'Q':2})
    train_data['Sex'] = train_data['Sex'].map({'male':0, 'female':1})
    test_data['Sex'] = test_data['Sex'].map({'male':0, 'female':1})

    train_data['Age'].fillna(train_data['Age'].mean(), inplace=True)
    test_data['Age'].fillna(test_data['Age'].mean(), inplace=True)
    train_data['Fare'].fillna(train_data['Fare'].mean(), inplace=True)
    test_data['Fare'].fillna(test_data['Fare'].mean(), inplace=True)

    features = ['Pclass', 'Sex','Age','SibSp', 'Parch', 'Fare', 'Embarked']
    train_features = train_data[features]
    train_labels = train_data['Survived']
    test_features = test_data[features]

    #train_features = dvec.fit_transform(train_features.to_dict(orient='record'))
    #test_features = dvec.transform(test_features.to_dict(orient='record'))

    以下是第二种情况:
    #train_data['Embarked'] = train_data['Embarked'].map({'S':0, 'C':1, 'Q':2})
    #test_data['Embarked'] = test_data['Embarked'].map({'S':0, 'C':1, 'Q':2})
    #train_data['Sex'] = train_data['Sex'].map({'male':0, 'female':1})
    #test_data['Sex'] = test_data['Sex'].map({'male':0, 'female':1})

    train_data['Age'].fillna(train_data['Age'].mean(), inplace=True)
    test_data['Age'].fillna(test_data['Age'].mean(), inplace=True)
    train_data['Fare'].fillna(train_data['Fare'].mean(), inplace=True)
    test_data['Fare'].fillna(test_data['Fare'].mean(), inplace=True)

    features = ['Pclass', 'Sex','Age','SibSp', 'Parch', 'Fare', 'Embarked']
    train_features = train_data[features]
    train_labels = train_data['Survived']
    test_features = test_data[features]

    train_features = dvec.fit_transform(train_features.to_dict(orient='record'))
    test_features = dvec.transform(test_features.to_dict(orient='record'))
    2019-03-19
  • JingZ
    # AdaBoost
    一开始竟然蓦然惯性用了AdaBoostRegressor,得到0.33的准确率,最后看了小伙伴代码,立马修正

    感觉算法代码不复杂,关键要自己从空白开始写,还需多实战

    from sklearn.ensemble import AdaBoostClassifier

    # 使用 Adaboost 分类模型
    ada = AdaBoostClassifier()
    ada.fit(train_features, train_labels)

    pred_labels = ada.predict(test_features)

    acc_ada_classifier = round(ada.score(train_features, train_labels), 6)
    print(u'Adaboost score 准确率为 %.4lf' % acc_ada_classifier)
    print(u'Adaboost cross_val_score 准确率为 %.4lf' % np.mean(cross_val_score(ada, train_features, train_labels, cv=10)))

    运行
    Adaboost score 准确率为 0.8339
    Adaboost cross_val_score 准确率为 0.8104
    2019-03-05
  • FORWARD―MOUNT
    老师,房价预测这个算法,50个弱分类器是怎么来的?
    2019-03-05
  • 佳佳的爸
    你好老师,完整的源代码在哪里可以下载到? 我说的是每节课里边的源代码。
    2019-03-04
收起评论
12
返回
顶部