前言
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 编程实现
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
- 数学建模导论 intro-mathmodel
(知识密度大、代码理论兼备)
https://datawhalechina.github.io/intro-mathmodel/#/ - Python科学计算 scientific-computing(数学建模导论的前置课程)
(知识密度小、代码实操强悍)
https://datawhalechina.github.io/scientific-computing/#/ - scikit-learn 官网 用户指南
(现成轮子实现模型)
https://scikit-learn.org/stable/machine_learning_map.html