数据分析实战 45 讲
陈旸
清华大学计算机博士
85359 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
第二模块:数据分析算法篇 (20讲)
第四模块:数据分析工作篇 (2讲)
数据分析实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

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

今天我带你用 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/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据分析实战 45 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(23)

  • 最新
  • 精选
  • TKbook
    源代码中: # 从 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:]

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

    18
  • 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的结果会比决策树分类器略好一些。

    7
  • 王彬成
    由于乘客测试集缺失真实值,采用 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)))

    作者回复: Good Job

    6
  • 梁林松
    跑第二块代码是需要引入两个模块 from sklearn.tree import DecisionTreeRegressor from sklearn.neighbors import KNeighborsRegressor

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

    3
  • Liam
    ax = fig.add_subplot(111)ax.plot([1,n_estimators],[dt_stump_err]*2, 'k-', label=u'决策树弱分类器 错误率')ax.plot([1,n_estimators],[dt_err]*2,'k--', label=u'决策树模型 错误率')ada_err = np.zeros((n_estimators,)). 疑问:这里*2是什么意思,能解析下代码吗?

    作者回复: print([0.8] * 2) 你会看到打印结果为:[0.8, 0.8] 列表 * n 代表列表被复制扩展n倍长。 乘号*常被用于快速初始化list,但有一个隐患:被乘号复制的对象都指向同一个空间,所以如果你的列表中的元素要用来存储不同值时,建议用for循环。 老师这里只是为了可视化,所以才使用这种方式。

    2
  • 得到结果: 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 用来返回预测的分类结果 这两处地方你调整下,再跑跑代码

    1
  • 小晨
    弱分类器准确率为 0.7868 决策树分类器准确率为 0.7823 AdaBoost分类器准确率为:0.8115 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Peter import numpy as np import pandas as pd from sklearn.ensemble import AdaBoostClassifier from sklearn.feature_extraction import DictVectorizer from sklearn.model_selection import cross_val_score from sklearn.tree import DecisionTreeClassifier # 迭代次数 n_estimators = 200 train_data = pd.read_csv(r'data/Titanic_Data_train.csv') test_data = pd.read_csv(r'data/Titanic_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['Fare'].fillna(train_data['Fare'].mean(), inplace=True) test_data['Fare'].fillna(test_data['Fare'].mean(), inplace=True) # 用登船港口最多的S补齐缺失 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] # 字符串数据规范化,转为int型 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' % dt_stump.score(train_features, train_labels)) # 决策树分类器 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) ada_score = np.mean(cross_val_score(ada, train_features, train_labels, cv=10)) print("AdaBoost分类器准确率为:%.4lf" % ada_score)

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

  • 萌辰
    在AdaBoost、决策树回归、KNN房价预测对比中发现,随机种子对决策树的预测结果有影响。 分别测试了三种不同的随机种子: dec_regressor=DecisionTreeRegressor(random_state=1) dec_regressor=DecisionTreeRegressor(random_state=20) dec_regressor=DecisionTreeRegressor(random_state=30) 测试结果为: 决策树均方误差1 = 36.65 决策树均方误差20 = 25.54 决策树均方误差30 = 37.19 思考: 此处考虑这里没有限制种子的随机性,对比的结果可能过于随机了,无法真实反映算法效果,两种算法原理中随机种子的应用情况不同。思考是不是采用多次随机MSE结果求平均的方法作为【比较项】更为合适 KNN算法无随机种子影响。

    作者回复: DecisionTreeRegressor的参数random_state随机数种子,用来控制估算器的随机性。 即使分割器设置为“best”,每个分割中的特征也始终是随机排列的。 当max_features <n_features时,算法将在每个分割处随机选择max_features,然后再在其中找到最佳分割。 但是,即使max_features = n_features,找到的最佳分割也可能因不同的运行而有所不同。 就是这种情况,如果对于几个分割而言标准的改进是相同的,并且必须随机选择一个分割。 为了在拟合过程中获得确定性的行为,random_state必须固定为整数。 使用相同random_state,则每次使用相同的分割策略。所以不同随机数种子参数,得到的结果不同。

  • §mc²ompleXWr
    使用自带的数据集就不用做数据规范化么?

    作者回复: 是否需要进行数据规范化,取决于所使用的模型和特征的数据范围。比如:树模型和朴素贝叶斯模型不需要进行规范化;如果数据集特征的数据已经都在0-1之间,或者已经符合标准化,则无需规范化。

  • 鲨鱼鲸鱼鳄鱼
    老师,请问AdaBoost模型在预测前需不需要对数据进行标准化或者归一化,做有什么好处,不做有什么好处呢

    作者回复: AdaBoost模型默认使用的弱分类器是决策树模型,树模型只看点之间的相对位置,不计算二者之间的距离,因此不需要进行数据规范化(包括标准化或归一化等)

收起评论
显示
设置
留言
23
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部