随机森林底层实现及调库实现

调库(随机森林、决策树分类莺尾花)

from sklearn.datasets import load_iris
from sklearn.metrics import precision_score
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor, export_graphviz
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt, warnings

warnings.filterwarnings('ignore')

data, target = load_iris(return_X_y=True)  # data = load_iris() x,y=......
# load_boston(return_X_y=False)方法来导出数据,其中参数return_X_y控制输出数据的结构,
# 若选为True,则将因变量和自变量独立导出
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.33, random_state=42)

# 决策树模型
dt = DecisionTreeClassifier()
dt.fit(X_train, y_train)
y_pred1 = dt.predict(X_test)
print('cart决策树:\n', precision_score(y_test, y_pred1, average='micro'))
print(dt.classes_)  # [0 1 2]
print(dt.feature_importances_)

# 随机森林模型
rf = RandomForestClassifier()
rf.fit(X_train, y_train)
y_pred2 = rf.predict(X_test)
print(y_pred2)
print('随机森林:\n', precision_score(y_test, y_pred2, average='micro'))
print(rf.feature_importances_)  # 打印特征重要性

# 存储决策树模型
# export_graphviz(dt,out_file='1803tree-wgs1c.dot', feature_names=['好花', '中等', '还行', '坏花'])

'''
参数average : string, [None, ‘micro’, ‘macro’(default), ‘samples’, ‘weighted’]

将一个二分类matrics拓展到多分类或多标签问题时,我们可以将数据看成多个二分类问题的集合,每个类都是一个二分类。接着,我们可以通过跨多个分类计算每个二分类metrics得分的均值,这在一些情况下很有用。你可以使用average参数来指定。

macro:计算二分类metrics的均值,为每个类给出相同权重的分值。当小类很重要时会出问题,因为该macro-averging方法是对性能的平均。另一方面,该方法假设所有分类都是一样重要的,因此macro-averaging方法会对小类的性能影响很大。

weighted:对于不均衡数量的类来说,计算二分类metrics的平均,通过在每个类的score上进行加权实现。

micro:给出了每个样本类以及它对整个metrics的贡献的pair(sample-weight),而非对整个类的metrics求和,它会每个类的metrics上的权重及因子进行求和,来计算整个份额。Micro-averaging方法在多标签(multilabel)问题中设置,包含多分类,此时,大类将被忽略。

samples:应用在multilabel问题上。它不会计算每个类,相反,它会在评估数据中,通过计算真实类和预测类的差异的metrics,来求平均(sample_weight-weighted)

average:average=None将返回一个数组,它包含了每个类的得分.

'''

底层

分类
import numpy as np
import pandas as pd
import random
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier

iris = load_iris()
X = pd.DataFrame(data=iris.data, columns=iris.feature_names)
Y = pd.DataFrame(data=iris.target)
data = pd.concat([X, Y], axis=1);
print(data)

# 训练随机森林
M = []  # 存储决策树模型的数组
R = []  # 存储各决策树随机选取的特征组合
n_trees = 100  # 设置森林中树的颗数

# 训练多棵树
for i in range(n_trees):
    # 随机选取样本
    sample = data.sample(frac=0.7)  # 对样本进行采样,目的是建造不同的树
    # 随机选取特征,随机选取k个特征组合r
    k = np.random.randint(1, sample.shape[1])  # 随机选取k个特征
    r = np.random.choice(range(sample.shape[1]), k, replace=False).tolist()  # replace=False 无放回的随机选取2个特征组合
    X = sample.iloc[:, r]

    # 选取Y
    Y = sample.iloc[:, -1]

    # 新建决策树模型
    model = DecisionTreeClassifier()
    model.fit(X, Y)

    # 存储模型
    M.append(model)  # 将决策树模型加入数组
    R.append(r)  # 将特征组合加入数组中
    print('第' + str(i) + '颗预测score=', model.score(X, Y))  # 打印每个基础模型的效果

# 测试随机森林,将每个模型预测值的结果添加到result(DataFrame)中
result = pd.concat([pd.DataFrame([M[i].predict(data.iloc[:, R[i]])]) for i in range(n_trees)], ignore_index=True)
# 输出预测结果,取众数作为最终对每个样本标签的预测值
predict = result.mode(axis=0).values[0].astype(int)
print('预测值结果=', predict)
# 计算准确率
score = sum(np.where(predict == iris.target, 1, 0)) / len(data)
print(score)

回归
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import r2_score

boston = load_boston()
X = pd.DataFrame(data=boston.data, columns=boston.feature_names)
Y = pd.DataFrame(data=boston.target)
data = pd.concat([X, Y], axis=1)

# 训练随机森林
M = []  # 存储决策树模型的数组
R = []  # 存储各决策树随机选取的特征组合
n_trees = 100  # 设置森林中树的颗数

# 训练多棵树
for i in range(n_trees):
    # 随机选取样本
    sample = data.sample(frac=0.7)  # 对样本进行采样,目的是建造不同的树
    # 随机选取特征,随机选取k个特征组合r
    k = np.random.randint(1, sample.shape[1])  # 随机选取k个特征
    r = np.random.choice(range(sample.shape[1]), k, replace=False).tolist()  # replace=False 无放回的随机选取k个特征组合
    X = sample.iloc[:, r]  # 选取K个特征组合

    # 选取Y
    Y = sample.iloc[:, -1];

    # 新建决策树模型
    model = DecisionTreeRegressor()
    model.fit(X, Y)

    # 存储模型
    M.append(model)  # 将决策树模型加入数组
    R.append(r)  # 将特征组合加入数组中
    print('第' + str(i) + '颗预测score=', model.score(X, Y))  # 打印每个基础模型的效果

# 测试随机森林,将每个模型预测值的结果添加到result(DataFrame)中
result = pd.concat([pd.DataFrame([M[i].predict(data.iloc[:, R[i]])]) for i in range(n_trees)], ignore_index=True)
# 输出预测结果,取众数作为最终对每个样本标签的预测值
predict = result.mean(axis=0).values
print('预测值结果=', predict)
# 计算R2
print('R2=', r2_score(boston.target, predict))

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WGS.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值