机器学习笔记6:Python底层实现集成学习

前言

在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好)。三个臭皮匠,顶个诸葛亮。集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型


1、导入数据

def read_xlsx(csv_path):
    data = pd.read_csv(csv_path)
    print(data)
    return data

2、划分训练集和测试集

为方便,此处直接调用了sklearn的包,底层实现方法可以参见我前面的文章。

from sklearn.model_selection import train_test_split
x = data.iloc[:, :-1]
y = data.iloc[:, -1]
x_train, x_test, y_train, y_test = train_test_split(x, y)

3、集成学习

3.1 最大投票法

最大投票方法通常用于分类问题。这种技术中使用多个模型来预测每个数据点。每个模型的预测都被视为一次“投票”。大多数模型得到的预测被用作最终预测结果。

def voting(x_train,x_test,y_train):
    model1 = DecisionTreeClassifier()
    model2 = KNeighborsClassifier()
    model3 = MultinomialNB()
    model1.fit(x_train,y_train)
    model2.fit(x_train,y_train)
    model3.fit(x_train,y_train)

    a = model1.predict(x_test)
    b = model2.predict(x_test)
    c = model3.predict(x_test)
    labels = []
    for i in range(len(x_test)):
        ypred = []
        ypred.append(a[i])
        ypred.append(b[i])
        ypred.append(c[i])
        counts = np.bincount(ypred)
        label = np.argmax(counts)
        labels.append(label)
    print(labels)
    return labels

除了最大投票法之外,还有平均法和加权平均法。

平均法类似于最大投票技术,对每个数据点的多次预测进行平均。此模型从所有模型中取平均值作为最终预测。平均法可用于在回归问题中进行预测或在计算分类问题的概率时使用。

加权平均法是平均法的扩展。为所有模型分配不同的权重,定义每个模型的预测重要性。例如,如果你的两个同事是评论员,而其他人在这方面没有任何经验,那么与其他人相比,这两个朋友的答案就更加重要。

3.2 Bagging

在Bagging方法中,利用bootstrap方法从整体数据集中采取有放回抽样得到N个数据集,在每个数据集上学习出一个模型,最后的预测结果利用N个模型的输出得到,具体地:分类问题采用N个模型预测投票的方式,回归问题采用N个模型预测平均的方式。

#有放回抽样
def random_sampling(x,y, m):
    x = np.array(x)
    y = np.array(y)
    a = np.random.permutation(len(x))
    subset = x[a]
    label = y[a]
    return subset, label

#对每个子集进行训练
def model(x_train,y_train,x_test):
    model = DecisionTreeClassifier()
    yclass = []
    for i in range(20):
        subset, label = random_sampling(x_train, y_train, 150)
        model.fit(subset, label)
        a = model.predict(x_test)
        a = list(a)
        yclass.append(a)
    data = DataFrame(yclass)
    ypred = []
    for col in data.columns:
        mean = data[col].mean()   #结果取平均值
        ypred.append(mean)
    print(ypred)
    return ypred

4、计算准确率

def accuracy(ypred, y_test):
    correct = 0
    y_test = list(y_test)
    for x in range(len(y_test)):
        if ypred[x] == y_test[x]:
            correct += 1
    accuracy = (correct / float(len(y_test))) * 100.0
    print("Accuracy:", accuracy, "%")
    return accuracy

总结

集成学习对弱分类器的改进效果较好。

GitHub:https://github.com/chenyi369/Ensemble-Learning

你可能感兴趣的:(python,算法,机器学习,决策树)