机器学习-决策树系列-随机森林 集成学习-28

发布时间 2024-01-04 21:38:15作者: jack-chen666

1. 概念

多个决策树组合在一起 对新来的样本进行预测 输出预测结果

有朋友的意见投票, 少数服从多数, 有的给出-1 有的给+1 将这些结果全部加一起 最后取符号是+1 -1 就行

majority can corret minority

不同的模型 给不同的权重:

如何生成不同的 决策树模型:

  1. 同样的数据 但是训练的超参 不同
  2. 同样的参数:
  3. 用不同的样本 训练
  4. 用不同的特征值训练

什么是bagging

bagging:对训练集进行抽样, 将抽样的结果用于训练g(x)。并行,独立训练。例如:random forest
boosting:利用训练集训练出模型 根据本次模型的预测结果, 调整训练集, 然后利用调整后的训练集训练下一个模型。串行。例如:adaboost,GBDT,Xgboost

random forest的思想:
有放回的随机抽取样本 训练得到单个gt 所有的gt均匀的对结果进行预测

随机森林
1、随机选择样本(放回抽样);
2、随机选择特征;
3、构建决策树;
4、随机森林投票(平均)
优点:
1.表现良好
2.可以处理高维度数据(维度随机选择)
3.辅助进行特征选择
4.得益于bagging 可以进行并行训练
缺点:
对于噪声过大的数据容易过拟合

什么是Out of bag data?
在进行抽样的时候, 有些有价值的样本数据始终没有被选到
概率:

这些训练过程中没有被选中的样本 就可以对训练的 模型进行验证 叫做验证集
rnd_clf.oob_score

3. 代码

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data[:, :2]  # 花萼长度和宽度
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

rnd_clf = RandomForestClassifier(n_estimators=15, max_leaf_nodes=16, n_jobs=1, oob_score=True)
rnd_clf.fit(X_train, y_train)
print(rnd_clf.oob_score_)

# bag_clf = BaggingClassifier(
#     DecisionTreeClassifier(splitter="random", max_leaf_nodes=16),
#     n_estimators=15, max_samples=1.0, bootstrap=True, n_jobs=1
# )
# bag_clf.fit(X_train, y_train)

y_pred_rf = rnd_clf.predict(X_test)
# y_pred_bag = bag_clf.predict(X_test)
print(accuracy_score(y_test, y_pred_rf))
# print(accuracy_score(y_test, y_pred_bag))


# Feature Importance
iris = load_iris()
rnd_clf = RandomForestClassifier(n_estimators=500, n_jobs=-1)
rnd_clf.fit(iris["data"], iris['target'])
for name, score in zip(iris['feature_names'], rnd_clf.feature_importances_):
    print(name, score)

4. 代码2

from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score


log_clf = LogisticRegression()
rnd_clf = RandomForestClassifier()
svm_clf = SVC()

voting_clf = VotingClassifier(
    estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)],
    voting='hard'
)

iris = load_iris()
X = iris.data[:, :2]  # 花萼长度和宽度
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

# voting_clf.fit(X, y)


for clf in (log_clf, rnd_clf, svm_clf, voting_clf):
    clf.fit(X_train, y_train)
    y_pred = clf.predict(X_test)
    print(clf.__class__.__name__, accuracy_score(y_test, y_pred))


bag_clf = BaggingClassifier(
    DecisionTreeClassifier(), n_estimators=10,
    max_samples=1.0, bootstrap=True, n_jobs=1
)
bag_clf.fit(X_train, y_train)
y_pred = bag_clf.predict(X_test)
print(y_pred)
y_pred_proba = bag_clf.predict_proba(X_test)
print(y_pred_proba)
print("bagging", accuracy_score(y_test, y_pred))


# oob
bag_clf = BaggingClassifier(
    DecisionTreeClassifier(), n_estimators=500,
    bootstrap=True, n_jobs=1, oob_score=True
)
bag_clf.fit(X_train, y_train)
print(bag_clf.oob_score_)
y_pred = bag_clf.predict(X_test)
print(accuracy_score(y_test, y_pred))

print(bag_clf.oob_decision_function_)