机器学习特点

常见机器学习算法

 
逻辑回归
决策树 
贝叶斯 
随机森林 
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


 


 


 

  

 


机器模型部署-PMML

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讲解及使用