【数学建模导论】Task04 机器学习

前言

Problem-Based Learning.
以解决问题为导向进行学习,培养工具思维

本章会接触到大量的算法,
一方面要理解算法的基本原理,
另一方面又要能针对实际问题进行灵活应用。

w(゚Д゚)w 要长脑子了!
本篇章先学习快速使用 scikit-learn 完成机器学习任务,
后续再对模型展开深入学习。(在本篇博客进行更新修改)

机器学习本身就是统计模型的延伸
学习过程中,我们完全可以把机器学习算法视作工具去使用。

❤️ ❤️ ❤️ ❤️

系列文章导航

【数学建模导论】Task01 数据处理与拟合模型
【数学建模导论】Task02 权重生成与评价模型
【数学建模导论】Task03 时间序列与投资模型
【数学建模导论】Task04 机器学习
【数学建模导论】Task05 多模数据与智能模型

使用scikit-learn完成机器学习任务

对特征的编码

鼠标右键 -> 在新标签页中打开图像
在这里插入图片描述

对特征的选择(与交叉验证)

鼠标右键 -> 在新标签页中打开图像
在这里插入图片描述

数据集的切分与打乱

鼠标右键 -> 在新标签页中打开图像
在这里插入图片描述

评估指标接口

分类问题

鼠标右键 -> 在新标签页中打开图像
在这里插入图片描述

回归问题

鼠标右键 -> 在新标签页中打开图像
在这里插入图片描述

聚类问题

鼠标右键 -> 在新标签页中打开图像
在这里插入图片描述

Python 编程实现

准备

访问 Graphviz 的官方网站 (https://www.graphviz.org/download/) 下载并安装 Graphviz。
安装过程中,确保选择“Add application directory to your system path”选项

导入数据并处理数据

import numpy as np
import pandas as pd
# 鸢尾花数据集,红酒数据集,乳腺癌数据集,糖尿病数据集
from sklearn.datasets import load_iris,load_wine,load_breast_cancer,load_diabetes

# 回归重要指标
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
# 分类重要指标
from sklearn.metrics import accuracy_score, confusion_matrix, f1_score, precision_recall_curve, roc_auc_score

#训练集训练集分类器
from sklearn.model_selection import train_test_split 

import graphviz #画文字版决策树的模块
import pydotplus #画图片版决策树的模块
from IPython.display import Image #画图片版决策树的模块

iris = load_iris()
print(iris.data)              # 数据I
print(iris.target_names)      # 标签名
print(iris.target)            # 标签值
print(iris.feature_names)     # 特证名(列名)

iris_dataframe = pd.concat([pd.DataFrame(iris.data),pd.DataFrame(iris.target)],axis=1)
print(iris_dataframe)

Xtrain, Xtest, Ytrain,Ytest = train_test_split(iris.data,iris.target,test_size=0.3)


在这里插入图片描述

随后选择对应接口创建模型,
输入数据通过 fit 方法进行训练,
然后进行 predict 并评估指标即可。

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis  # 导入LDA模型
from sklearn.svm import SVC                                           # 导入SVM模型(支持向量机)从中调用SVC模型 (支持向量机分类)
from sklearn.linear_model import LogisticRegression,LinearRegression
from sklearn.neighbors import KNeighborsRegressor,KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeRegressor,DecisionTreeClassifier
from sklearn.ensemble import RandomForestRegressor,RandomForestClassifier
from sklearn.ensemble import ExtraTreesRegressor,ExtraTreesClassifier
from sklearn.ensemble import AdaBoostRegressor,AdaBoostClassifier
from sklearn.ensemble import GradientBoostingRegressor,GradientBoostingClassifier

clf = RandomForestClassifier()
clf.fit(Xtrain, Ytrain)
Ypredict=clf.predict(Xtest)
print(r2_score(Ytest,Ypredict))
# 其中,决策树、随机森林等具有树形结构的基学习器可以把树形结构打印出来并保存为PDF或png文件

from sklearn import tree

clf = clf.estimators_[0]

tree_data = tree.export_graphviz(

    clf

    ,feature_names =iris.feature_names

    ,class_names = iris.target_names#也可以自己起名

    ,filled = True #填充颜色

    ,rounded = True #决策树边框圆形/方形

)

graph1 = graphviz.Source(tree_data.replace('helvetica','Microsoft YaHei UI'), encoding='utf-8')

graph1.render('./iris_tree')

基于距离的KNN模型

鼠标右键 -> 在新标签页中打开图像
在这里插入图片描述

Python 编程实现

在这里插入图片描述

scikit-learn 官网 用户指南 12. Choosing the right estimator
https://scikit-learn.org/stable/machine_learning_map.html

导入数据并处理数据

from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

x,y=load_iris(return_X_y=True)  # 返回两个对象:特征矩阵x(数据)和目标向量y(标签值)。
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.7,random_state=42)

现成轮子(方式一)实现模型
随后选择对应接口创建模型,
输入数据通过 fit 方法进行训练,
然后进行 predict 并评估指标即可。

from sklearn.neighbors import KNeighborsRegressor,KNeighborsClassifier

clf = KNeighborsClassifier()    # 参数n_neighbors=5(默认k值为5)
clf.fit(x_train, y_train)
y_predict=clf.predict(x_test)
print(accuracy_score(y_test,y_predict))

手搓代码(方式二)实现模型

# 我们很容易得到距离的计算方法
def distance(a,b):
    return np.sqrt(np.sum(np.square(a-b)))

# 针对单一样本,如何得到它最近的K个节点并投票呢?
# 我们说,首先要计算它到其他点的距离,然后找最近的K个抽出来,计数。
# 因此,如果训练数据集已知,可以写函数并进行封装就可以包装为:
def KNN(x_train,y_train,x_test,k):
    # 定义一个内部函数,用于计算测试样本的预测标签
    def get_label(x):
        dist=list(map(lambda a:distance(a,x),x_train))  # 使用map函数,对于x_train中的每一个训练样本a,map都会执行distance(a, x)。结果存储在dist列表中
        ind=np.argsort(dist)                            # 对距离进行排序,得到距离从小到大的索引
        ind=ind[:k]                                     # 取出距离最小的前k个索引
        # 初始化一个长度为3的数组,用于统计,返回票数最多的类别作为预测标签
        labels=np.zeros(3)
        for i in ind:
            label = y_train[i].astype(int)
            labels[label] += 1
        return np.argmax(labels)
    
    # 初始化一个数组,用于存储所有测试样本的预测标签。
    y_predict = np.zeros(len(x_test))
    for i in range(len(x_test)):
        y_predict[i]=get_label(x_test[i])
    return y_predict

# 最后,使用不同的K值进行测试:
for k in range(1,10):
    y_predict=KNN(x_train,y_train,x_test,k)
    print(accuracy_score(y_test,y_predict))
    
    

基于优化的LDA与SVM模型

LDA 的Python 编程实现

导入数据并处理数据

from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

x,y=load_iris(return_X_y=True)  # 返回两个对象:特征矩阵x(数据)和目标向量y(标签值)。
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.7,random_state=42)

现成轮子实现模型
LDA用于分类

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis  # 导入LDA模型

# LDA用于分类
LDA = LinearDiscriminantAnalysis()
LDA.fit(x_train, y_train)
y_predict=LDA.predict(x_test)
print(accuracy_score(y_test,y_predict))

LDA用于降维

import matplotlib.pyplot as plt 
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei','Songti SC','STFangsong']      # 用来正常显示中文
plt.rcParams['axes.unicode_minus'] = False                              # 用来正常显示负号
# plt.style.use("ggplot")   #风格使用ggplot

# LDA用于降维
LDA = LinearDiscriminantAnalysis(n_components=2)  # 假设我们希望降到2维
LDA.fit(x_train, y_train)
x_train_LDA = LDA.transform(x_train)
x_test_LDA = LDA.transform(x_test)

# 可视化降维后的数据
plt.figure()
# 为每个类单独绘制散点图,并添加标签
label_names = {0: 'Class 0', 1: 'Class 1', 2: 'Class 2'}  # 更新这里的键值对以匹配你的数据
colors = ['r', 'g', 'b']  # 或者使用其他颜色方案
for class_label, color in zip(label_names.keys(), colors):
    indices = (y_train == class_label)
    plt.scatter(x_train_LDA[indices, 0], x_train_LDA[indices, 1], c=color, label=label_names[class_label])
plt.title('LDA Reduced Data')
plt.xlabel('First LDA component')
plt.ylabel('Second LDA component')
plt.legend()
plt.show()

在这里插入图片描述

SVM 的Python 编程实现

导入数据并处理数据

from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

x,y=load_iris(return_X_y=True)  # 返回两个对象:特征矩阵x(数据)和目标向量y(标签值)。
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.7,random_state=42)

现成轮子实现模型

from sklearn.svm import SVC                                           # 导入SVM模型(支持向量机)从中调用SVC模型 (支持向量机分类)

# SVC用于分类
SVC = SVC()
SVC.fit(x_train, y_train)
y_predict=SVC.predict(x_test)
print(accuracy_score(y_test,y_predict))

Read more

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

机动人心

解密未来,一文解锁一周动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值