做机器学习深度学习用python还是matlab比较好?这是很多朋友比较纠结的问题,因为一提到机器学习,大家都会想到Python。确实,Python提供了大量机器学习库,如sklearn、pytorch、tensorflow等,很多C++库也提供Python接口,如dlib,使用起来确实方便。
Matlab虽然不如Python开放,但也提供了大量机器学习算法,常见的比如PCA、SVM、决策树、集成学习等,应付日常需求绰绰有余。更重要的是,Matlab提供算法转C功能,就是训练的模型可以转为C代码、动态链接库dll,提供给软件使用。下图为Matlab2019b能转C的算法,以后还会越来越多。这一点貌似Python比较难做到,Python转C不可能的,需要借助C++库复现算法,如使用dlib。
此外,Matlab还提供了专门的App界面,无需编写代码就能做机器学习,完美!
下面以分类器为例做个简要介绍。
1、加载数据
Matlab自带fisher数据
>> fishertable = readtable('fisheriris.csv');
2、打开分类器App
>>classificationLearner
3、导入数据
新建会话>>从工作区
按默认配置开始会话
默认选择fishertable变量,因为工作区只有这个变量;
默认选择最后一列Species为响应;
默认使用交叉验证。
4、训练树模型
各菜单页含义:
特征:选择参与训练的特征或者使用PCA降维,默认使用全部特征,不降维
选项:设定误分类代价,就是类别准确率优先级,哪些一定要分对,哪些误差大点能接收
模型类型:选择训练模型及模型参数配置
训练:使用并行同时训练多模型
绘图:分类器效果评价,散点图、混淆矩阵、ROC曲线等
导出:导出训练结果、训练代码或模型文件
简单起见,直接使用默认的树模型做训练(默认会打开并行池,同意即可),结果如下:准确率96%,还不错
5、模型一把梭
可训练的分类器很多,选择全部来个一把梭:
开始训练,可以看到有4个worker同时在训练
最后,准确率最高的是线性判别模型,准确率98%
6、导出函数
如果想看Matlab的训练代码,点击导出>>生成函数,得到训练代码:以后有类似应用,直接运行这个函数即可,不用再打开App界面
function[trainedClassifier, validationAccuracy] =trainClassifier(trainingData)% [trainedClassifier, validationAccuracy] = trainClassifier(trainingData)
% 返回经过训练的分类器及其准确度。以下代码重新创建在 Classification Learner App 中训
% 练的分类模型。您可以使用该生成的代码基于新数据自动训练同一模型,或通过它了解如何以程序化方
% 式训练模型。
%
% 输入:
% trainingData: 一个所含预测变量和响应列与导入 App 中的相同的表。
%
% 输出:
% trainedClassifier: 一个包含训练的分类器的结构体。该结构体中具有各种关于所训练分
% 类器的信息的字段。
%
% trainedClassifier.predictFcn: 一个对新数据进行预测的函数。
%
% validationAccuracy: 一个包含准确度百分比的双精度值。在 App 中,"历史记录" 列
% 表显示每个模型的此总体准确度分数。
%
% 使用该代码基于新数据来训练模型。要重新训练分类器,请使用原始数据或新数据作为输入参数
% trainingData 从命令行调用该函数。
%
% 例如,要重新训练基于原始数据集 T 训练的分类器,请输入:
% [trainedClassifier, validationAccuracy] = trainClassifier(T)
%
% 要使用返回的 "trainedClassifier" 对新数据 T2 进行预测,请使用
% yfit = trainedClassifier.predictFcn(T2)
%
% T2 必须是一个表,其中至少包含与训练期间使用的预测变量列相同的预测变量列。有关详细信息,请
% 输入:
% trainedClassifier.HowToPredict
% 提取预测变量和响应
% 以下代码将数据处理为合适的形状以训练模型。
%
inputTable = trainingData;
predictorNames = {'SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'};
predictors = inputTable(:, predictorNames);
response = inputTable.Species;
isCategoricalPredictor = [false, false, false, false];
% 训练分类器
% 以下代码指定所有分类器选项并训练分类器。
classificationDiscriminant = fitcdiscr(...
predictors, ...
response, ...
'DiscrimType', 'linear', ...
'Gamma', 0, ...
'FillCoeffs', 'off', ...
'ClassNames', {'setosa'; 'versicolor'; 'virginica'});
% 使用预测函数创建结果结构体
predictorExtractionFcn = @(t) t(:, predictorNames);
discriminantPredictFcn = @(x) predict(classificationDiscriminant, x);
trainedClassifier.predictFcn = @(x) discriminantPredictFcn(predictorExtractionFcn(x));
% 向结果结构体中添加字段
trainedClassifier.RequiredVariables = {'PetalLength', 'PetalWidth', 'SepalLength', 'SepalWidth'};
trainedClassifier.ClassificationDiscriminant = classificationDiscriminant;
trainedClassifier.About = '此结构体是从 Classification Learner R2019b 导出的训练模型。';
trainedClassifier.HowToPredict = sprintf('要对新表 T 进行预测,请使用: \n yfit = c.predictFcn(T) \n将 ''c'' 替换为作为此结构体的变量的名称,例如 ''trainedModel''。\n \n表 T 必须包含由以下内容返回的变量: \n c.RequiredVariables \n变量格式(例如矩阵/向量、数据类型)必须与原始训练数据匹配。\n忽略其他变量。\n \n有关详细信息,请参阅 How to predict using an exported model。');
% 提取预测变量和响应
% 以下代码将数据处理为合适的形状以训练模型。
%
inputTable = trainingData;
predictorNames = {'SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'};
predictors = inputTable(:, predictorNames);
response = inputTable.Species;
isCategoricalPredictor = [false, false, false, false];
% 执行交叉验证
partitionedModel = crossval(trainedClassifier.ClassificationDiscriminant, 'KFold', 5);
% 计算验证预测
[validationPredictions, validationScores] = kfoldPredict(partitionedModel);
% 计算验证准确度
validationAccuracy = 1 - kfoldLoss(partitionedModel, 'LossFun', 'ClassifError');
Other
要做回归分析,同理使用Regression Learner,下图为Matlab提供的回归算法
使用Matlab做机器学习是不是很方便,零基础傻瓜式入门!