常见机器学习算法 逻辑回归 决策树 贝叶斯 随机森林 KNN SVM 集成学习算法等 机器学习算法特点 它们的共同特点是:相互独立、顺序随意 各个特征相互独立,一个样本的 特征顺序 随意,结果都一样 对于一个样本,如果调换其特征的顺序,有不同的业务含义,那么就不能使用机器学习 比如,iris数据集, 四个特征是植物某些部分的长与宽,显然它们之间的顺序不影响它属于哪类植物 又比如,我欠银行一百万,银行欠我一百万, 虽然单词都一样,但他们有不同的含义,就不能使用机器学习解决此类问题 这就是选择算法前要考虑的 大方向问题 |
机器学习与规则 规则能区别的,通常使用规则 规则不容易区分的,才用机器学习 机器学习中如果有一部分特征占的比重很大 - 可以将这样的特征放到规则中, - 个人建议超过50%时,就是这一个特征超过剩下所有特征的作用时 - 如果有部分特征很重要,那么可以对类别进一步细分 - 机器学习本质走的还是规则,这种规则不同于神经网络那样,受样本比重影响较大 - 当类别分的细时,重要特征之后,还可以通过其他特征,通向不同的类别 能否将规则与机器学习的特征放在一起进行训练 可以,最终如何看效果,AI是一门以实践为主的学科 |
疾病,异常行为 等,通常规定异常为1,正常为0 疾病: - 疾病有很多种,比如你检测的只是肝方向的疾病, - 训练集有两个类别的数据,正常,异常 - 这里面有个问题 - 就是肝病也有多种,甚至说有些肝方面的疾病,现代医学还没有检测到/发现 - 但这没有关系, - 因为模型也学习了正常肝的样本,当出现异常时,至少模型的分值也不会接近0 异常行为 - 同疾病类似,异常行为在变化,随时间,随地区有变化 - 但正确行为却是变化不大的,相对稳定 - 当模型分值偏离正常分值0时,那么意味着就算不是指定的异常,那它也不算正常 |
|
|
模型选择 模型训练:fit 模型评估: - 损失估计,mse - ((y_pred - y_test)**2).mean() 参数优化:超参数调优 模型预测:predict |
数据获取:自己有,自己造,买 数据分析:业务分析,特征工程 根据数据选择模型 |
机器学习中标签数据为1维,通常也是1维,如果不是,则转化为1维 label = np.array(y_train) if label.ndim > 1: label = label.ravel() # 转换为一维数组 label.shape |
|
|
class Model(object): """机器学习模型通用框架 """ def __init__(self, parameters): """ 超参数定义初始化 """ self.parameters = parameters def fit(self, X, y): """训练 """ pass def predict(self, X): """预测 """ pass |
机器学习是一个庞大的领域,包含了多种不同类型的算法,每种算法都有其特定的应用场景和优势。以下是一些常用的机器学习算法: 一、监督学习算法 线性回归(Linear Regression): 原理:通过拟合最佳直线来建立输入和输出之间的关系,用于预测连续型变量。 应用场景:房价预测、销售额预测等。 逻辑回归(Logistic Regression): 原理:通过逻辑函数将线性回归的结果转换为概率值,用于二分类问题。 应用场景:垃圾邮件分类、疾病诊断等。 决策树(Decision Trees): 原理:基于树形结构进行分类或回归,通过一系列规则对数据进行划分。 应用场景:信贷风险评估、客户流失预测等。 支持向量机(Support Vector Machines, SVM): 原理:寻找最佳超平面来划分数据,使不同类别的数据点间隔最大。 应用场景:文本分类、图像识别等。 随机森林(Random Forest): 原理:集成多个决策树,通过投票或平均预测结果来做出决策。 应用场景:各种分类和回归问题。 K近邻算法(K-Nearest Neighbors, KNN): 原理:根据新数据点的K个最近邻的数据点进行分类或回归。 应用场景:文本分类、推荐系统等。 朴素贝叶斯(Naive Bayes): 原理:基于贝叶斯定理和特征条件独立性假设进行分类。 应用场景:垃圾邮件识别、新闻分类等。 二、无监督学习算法 K均值聚类(K-Means Clustering): 原理:将数据划分为K个簇,使得每个簇内的数据尽可能相似。 应用场景:客户细分、图像分割等。 主成分分析(Principal Component Analysis, PCA): 原理:通过正交变换将数据转换为线性不相关的变量(主成分)。 应用场景:数据降维、可视化等。 三、其他常用算法 神经网络(Neural Networks): 原理:模拟人脑神经元网络的结构和工作方式,通过构建多层神经元网络来进行学习和预测。 应用场景:图像识别、语音识别、自然语言处理等。 集成方法(Ensemble Methods): 包括多种算法,如Boosting、Bagging、Stacking等,通过结合多个模型的预测结果来提高整体预测性能。 关联规则学习(Association Rule Learning): 原理:通过寻找最能够解释数据变量之间关系的规则,来找出大量多元数据集中有用的关联规则。 应用场景:推荐系统、市场分析等。 降维算法(Dimensionality Reduction Algorithms): 如奇异值分解(SVD)、t-SNE等,用于减少数据的特征数量,同时保留主要信息。 Q学习(Q-Learning): 一种基于值的强化学习算法,通过更新Q值(状态-动作对的值)来学习最优策略。 应用场景:游戏AI、机器人控制等。 高斯混合模型(Gaussian Mixture Model, GMM): 原理:将数据建模为多个高斯分布的混合,用于聚类和密度估计。 应用场景:音频信号处理、图像分割等。 隐马尔可夫模型(Hidden Markov Model, HMM): 原理:用于序列数据的建模,如语音识别和文本生成。 应用场景:自然语言处理、生物信息学等。 这些算法各自具有不同的特点和应用场景,选择合适的算法对于解决实际问题至关重要。 |
https://scikit-learn.org/stable/ https://scikit-learn.org/stable/api/index.html |
|
|
python导出PMML文件 将机器学习模型转为一个xml文件,供java程序访问 模型以决策树例,决策树模型训练完后,就是一堆 if else判断, 把这种逻辑以及数据相关信息转为xml存储 python pmml安装 pip install sklearn-pandas pip install --user --upgrade git+https://github.com/jpmml/sklearn2pmml.git 或 pip install sklearn2pmml -i https://pypi.tuna.tsinghua.edu.cn/simple JDK安装 因为sklearn2pmml模块中包含了java代码, 所以使用这个功能,需要安装JDK 安装过程忽略 from sklearn.datasets import load_iris iris = load_iris() import pandas as pd from sklearn2pmml import PMMLPipeline from sklearn2pmml import sklearn2pmml from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier() pipeline = PMMLPipeline([("classifier", clf)]) # pipeline.fit(iris.data, iris.target) # pmml建议输入的数据带上列名 X = pd.DataFrame(iris.data,columns=iris.feature_names) y = pd.DataFrame(iris.target) pipeline.fit(X, y) sklearn2pmml(pipeline, "tree2.pmml", with_repr = True) 先生成pkl文件再用jar转换1 import joblib from sklearn.datasets import load_iris iris = load_iris() import pandas as pd from sklearn2pmml import PMMLPipeline from sklearn2pmml import sklearn2pmml from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier() pipeline = PMMLPipeline([("classifier", clf)]) X = pd.DataFrame(iris.data,columns=iris.feature_names) y = pd.DataFrame(iris.target) pipeline.fit(X, y) joblib.dump(value=pipeline, filename="tree3.pkl") git clone https://github.com/jpmml/jpmml-sklearn.git cd jpmml-sklearn mvn clean install 生成可执行jar文件 pmml-sklearn-example/target/pmml-sklearn-example-executable-1.7-SNAPSHOT.jar 测试 $ java -jar ./pmml-sklearn-example-executable-1.7-SNAPSHOT.jar --pkl-input tree3.pkl --pmml-output tree3.pmml 先生成pkl文件再用jar转换2 与前面一次转换不同的是, 这一次转换python这边没有涉及pmml包,转换的工作全部放在了java端 这种方式无法携带列名,在Java读取pmml时很不友好, 即便训练时,带入了列名, 但/pmml-sklearn-example-executable-1.7-SNAPSHOT.jar转换后,列名还是被转换成了x1,x2,... 因此还是推荐保存时使用PMMLPipeline import joblib from sklearn.datasets import load_iris iris = load_iris() from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier() clf.fit(iris.data, iris.target) joblib.dump(value=clf, filename="tree4.pkl") java -jar ./pmml-sklearn-example-executable-1.7-SNAPSHOT.jar --pkl-input tree4.pkl --pmml-output tree4.pmml 接口 如果模型是python开发的,使用flask最方便 当然了,只要能提供个接口,让其他程序访问你对应的模型都OK |
wget https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz git clone https://github.com/jpmml/jpmml-sklearn.git cd jpmml-sklearn mvn clean install 关键是现在的jpmml-sklearn要求JDK至少11 生成jar文件 pmml-sklearn/target/pmml-sklearn-1.7-SNAPSHOT.jar 生成可执行jar文件 pmml-sklearn-example/target/pmml-sklearn-example-executable-1.7-SNAPSHOT.jar 测试 $ java -jar ./pmml-sklearn-example-executable-1.7-SNAPSHOT.jar --pkl-input tree3.pkl --pmml-output tree3.pmml |
|
|
|
joblib 保存 import joblib import numpy as np from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import load_iris X,y = load_iris(return_X_y=True) # 模型定义 model = DecisionTreeClassifier(criterion="gini", max_depth=5) # 训练 model.fit(X=X,y=y) # 保存 # 模型保存推荐使用joblib joblib.dump(model,"model1.pkl") joblib 加载 import joblib model = joblib.load("model1.pkl") from sklearn.datasets import load_iris X,y = load_iris(return_X_y=True) # 预测 model.predict(X=X) array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]) joblib.dump joblib.dump可以存储不只是模型对象,可以是任何一个python对象 - 当然了,python的模型对象,也是一个python对象 joblib.dump(value,filename,compress=0,protocol=None) value:Python对象。 filename:文件名,支持的文件扩展名(“.z”,“.gz”,“bz2”,“.xz”,“.lzma”) compress: - int从0到9或bool或 - 2元组。第一个元素压缩字符串(例如’zlib’,‘gzip’,‘bz2’,‘lzma’,'xz '),第二个元素是0到9的整数,对应于压缩级别。 protocol:不用管,与pickle里的protocol参数一样 joblib.load joblib.load(filename, mmap_mode=None) filename:str.pathlib.Path或文件对象。要从中加载对象的文件或文件路径。 mmap_mode:{无,‘r +’,‘r’,‘w +’,‘c’},可选如果不是“None”,则从磁盘对阵列进行内存映射。此模式对压缩文件无效。请注意,在这种情况下,重建对象可能不再与原始对象完全匹配。 主要用法 joblib.load(filename) |
pickle import numpy as np from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import load_iris X,y = load_iris(return_X_y=True) # 模型定义 model = DecisionTreeClassifier(criterion="gini", max_depth=5) # 训练 model.fit(X=X,y=y) import pickle with open('model.pkl', 'wb') as file: pickle.dump(model, file) pickle.load的参数是python文件对象,不是字符串路径 import pickle with open("model.pkl", 'rb') as f: model = pickle.load(f) from sklearn.datasets import load_iris X,y = load_iris(return_X_y=True) model.predict(X) array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]) |
|
|
|
sklearn2pmml github PMML讲解及使用