|
常见机器学习算法
逻辑回归
决策树
贝叶斯
随机森林
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])
|
|
|
|
|
|
|