35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?
该思维导图由 AI 生成,仅供参考
如何使用 AdaBoost 工具
- 深入了解
- 翻译
- 解释
- 总结
AdaBoost算法不仅适用于分类问题,还可用于回归分析。本文介绍了如何使用AdaBoost对房价进行预测,并提供了在sklearn中创建AdaBoost分类器和回归器的方法。文章还展示了如何使用AdaBoost对波士顿房价数据集进行预测,并与决策树回归和KNN回归进行对比。结果显示,AdaBoost的均方误差更小,表明其预测效果更优。因此,AdaBoost是一种常用的分类和回归算法之一。 在sklearn中,AdaBoost默认采用决策树模型,通过对比AdaBoost中的弱分类器、决策树分类器和AdaBoost模型在分类准确率上的表现,文章展示了AdaBoost的优势。通过代码演示,读者可以清晰地看到弱分类器、决策树模型和AdaBoost模型在迭代次数上的错误率变化。结果显示,虽然单独的一个决策树弱分类器效果不佳,但多个决策树弱分类器组合形成的AdaBoost分类器具有更好的分类效果。 总结来看,AdaBoost算法在回归分析和分类问题中都表现出色。通过迭代机制,AdaBoost能够将原本性能不强的分类器组合起来,形成一个强分类器,从而提高预测准确率。读者可以通过本文学习如何使用AdaBoost算法进行回归分析和分类预测,并了解其与决策树模型的对比,从而更好地应用AdaBoost算法解决实际问题。
《数据分析实战 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:]
编辑回复: 您好,文章已进行更正,谢谢您的反馈。
2019-03-0518 - 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-047 - 王彬成由于乘客测试集缺失真实值,采用 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
2019-03-046 - 梁林松跑第二块代码是需要引入两个模块 from sklearn.tree import DecisionTreeRegressor from sklearn.neighbors import KNeighborsRegressor
编辑回复: 对的 需要引入相应的回归类库。
2019-03-043 - Liamax = 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循环。 老师这里只是为了可视化,所以才使用这种方式。
2021-03-262 - 滢得到结果: 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-211 - 小晨弱分类器准确率为 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的结果会比决策树分类器略好一些
2021-03-10 - 萌辰在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,则每次使用相同的分割策略。所以不同随机数种子参数,得到的结果不同。
2020-07-05 - §mc²ompleXWr使用自带的数据集就不用做数据规范化么?
作者回复: 是否需要进行数据规范化,取决于所使用的模型和特征的数据范围。比如:树模型和朴素贝叶斯模型不需要进行规范化;如果数据集特征的数据已经都在0-1之间,或者已经符合标准化,则无需规范化。
2020-06-09 - 鲨鱼鲸鱼鳄鱼老师,请问AdaBoost模型在预测前需不需要对数据进行标准化或者归一化,做有什么好处,不做有什么好处呢
作者回复: AdaBoost模型默认使用的弱分类器是决策树模型,树模型只看点之间的相对位置,不计算二者之间的距离,因此不需要进行数据规范化(包括标准化或归一化等)
2020-05-25