type
Post
status
Published
summary
这是一篇算法调用集合整理,搜集了一些常用的机器学习算法的调用方式、参数详解、调参方法和实例。仅供学习、记录和快速查询,内容还在持续更新中。
slug
date
May 31, 2023
tags
模型调用
调参
Sklearn
category
机器学习
password
icon
URL
Property
Aug 18, 2023 07:56 AM
先放上大名鼎鼎的算法选择图
notion image

一、分类算法

from sklearn.linear_model import Ridge # 岭回归 from sklearn.linear_model import Lasso # 套索回归 from sklearn.linear_model import LinearRegression # 线性回归 from sklearn.linear_model import LogisticRegression # 逻辑斯蒂 from sklearn.tree import DecisionTreeClassifier # 决策树--分类 from sklearn.tree import DecisionTreeRegressor # 决策树--回归 from sklearn.ensemble import RandomForestClassifier # 随机森林--分类 from sklearn.ensemble import RandomForestRegressor # 随机森林--回归 from sklearn.ensemble import GradientBoostingClassifier # GBDT--分类 from sklearn.ensemble import GradientBoostingRegressor # GBDT--回归 import xgboost as gbt from xgboost import XGBClassifier # XGBoost import lightgbm as lgbm from lightgbm import LGBMClassifier # LightGBM from sklearn.svm import SVC # 支持向量机--分类 from sklearn.svm import SVR # 支持向量机--回归 from sklearn.neighbors import KNeighborsClassifier # KNN--分类 from sklearn.neighbors import KNeighborsRegressor # KNN--回归 from sklearn.neural_network import MLPClassifier # 多层感知机

1.1、逻辑回归

1.1.1、示例&调参

from sklearn.linear_model import LogisticRegression # 逻辑斯蒂(人为指定一个正则化系数) from sklearn.linear_model import LogisticRegressionCV # 逻辑斯蒂(使用交叉验证来选择正则化系数C,用法大致相同) from sklearn.model_selection import GridSearchCV # 网格搜索 clf_lr = LogisticRegression() # 定义模型实例 clf_lr.fit(X, y) # 训练模型 clf_lr.predict(X) # 样本对应各个类别预测标签 param_grid = {"penalty":['l1', 'l2'], "C":[0.01, 0.1, 1, 10, 100]} grid_search_lr = GridSearchCV(clf_lr, param_grid, cv=5, scoring='neg_log_loss') grid_search_lr.fit(X, y) grid_search_lr.best_score_ # 获取最高分 grid_search_lr.best_params_ # 获取被搜索的最好参数 grid_search_lr.best_estimator_ # 获取最佳估计器(带所有参数的值)

1.1.2、参数详解(部分)

参数
含义
默认值
类型
可选项
选择经验
penalty
正则化项
l2
str
None l1:l1正则化 l2:l2正则化 elasticnet:l1+l2
解决过拟合选择l2,如果还是过拟合再选择l1 特征多时,想要不重要的特征系数归零让系数稀疏化,选择l1
C
正则化系数λ的倒数
1
positive float
值越小正则化越强
class_weight
类别权重
None
dict or str
自定义字典或balanced
自定义:class_weight={0:0.9, 1:0.1};自动计算:‘balanced’
random_state
随机数种子
None
int
仅在正则化优化算法为sag,liblinear时有用
solver
优化算法
lbfgs
str
liblinear:基于开源的liblinear库实现 lbfgs:拟牛顿法的一种; newton-cg:拟牛顿法的一种; sag:随机平均梯度下降; saga:线性收敛的随机优化算法;
对于小型数据集:可以选择‘liblinear’, 对于大型数据集(10w+):’sag’和’saga’ 对于多分类问题:’newton-cg’,‘sag’,'saga’,’lbfgs’ 只能处理L2惩罚:‘newton-cg’、'lbfgs’和’sag’ 处理L1和L2惩罚:’liblinear’和’saga’
tol
停止优化的误差容忍度
1e-4
float
值越小,精度越高,但是训练时间也可能随之增加。
max_iter
最大迭代次数
100
int
仅适用于newton-cg,sag和lbfgs求解器
multi_class
分类方式
ovr
str
ovr:选一类为正,进行二分类 multinomial:选多类为正,进行二分类
二分类,选哪个无所谓 多分,ovr速度快效果略差
verbose
输出日志
0
int
0、1
n_jobs
工作核数
1
int
-1,使用所有可用核心
模型方法
clf_lr.fit(X, y) # 训练模型 clf_lr.get_params([deep]) # 获取模型参数 clf_lr.predict(X) # 样本对应各个类别预测标签 clf_lr.predict_proba(X) # 样本对应各个类别的概率 clf_lr.predict_log_proba(X) # 样本对应各个类别的概率的对数转化 clf_lr.score(X, y) # 模型预测得分(官方文档描述是accuracy准确率)

1.2、随机森林

1.2.1、示例&调参

from sklearn.ensemble import RandomForestClassifier # 随机森林 from sklearn.model_selection import GridSearchCV # 网格搜索 clf_rf = RandomForestClassifier() # 定义模型实例 clf_rf.fit(X, y) # 训练模型 clf_rf.predict(X) # 样本对应各个类别预测标签 clf_lr.predict_proba(X) # 样本对应各个类别的概率 param_grid = {'n_estimators':range(10,71,10), 'max_features':range(3,11,2), 'max_depth':range(3,14,2), 'min_samples_split':range(80,150,20), 'min_samples_leaf':range(10,60,10)} grid_search_rf = GridSearchCV(clf_rf, param_grid = param_grid, scoring='roc_auc',cv=5) grid_search_rf.fit(X,y) grid_search_rf.best_score_ # 获取最高分 grid_search_rf.best_params_ # 获取被搜索的最好参数 grid_search_rf.best_estimator_ # 获取最佳估计器(带所有参数的值)

1.2.2、参数详解(部分)

参数类型
参数
含义
默认值
类型
可选项
选择经验
框架参数
n_estimators
树的棵数
l00
int
太小容易欠拟合,太大加大计算量,临界值后提升会很小
框架参数
criterion
决策树算法
gini
str
gini:基尼系数,CART算法 entropy:信息熵,ID3 算法 log_loss:对数损失,同entropy
推荐默认
框架参数
oob_score
是否采用袋外样本来评估模型
False
bool
True、False
条件允许的话设置为True
决策树参数
max_depth
树的最大深度
None
int
决策树参数
max_features
树划分时最大特征数
sqrt
str or int or float
int:整数n个特征 float:n_features * float 个特征 auto:sqrt(n_features) sqrt:sqrt(n_features),同上 log2:log2(n_features) None
推荐默认
决策树参数
min_samples_split
分割内部节点所需最小样本数
2
int or float
int:整数n个样本 float:n_sample * float 个样本
如果样本量数量级非常大,则推荐增大这个值。
决策树参数
min_samples_leaf
分割叶子节点所需最少样本数
1
int or float
int:整数n个样本 float:n_sample * float 个样本
如果样本量数量级非常大,则推荐增大这个值。
决策树参数
bootstrap
是否有放回采样
True
bool
True、False
决策树参数
n_jobs
工作核数
1
int
-1,使用所有可用核心

1.3、GBDT

1.3.1、示例&调参

from sklearn.ensemble import GradientBoostingClassifier # GBDT--分类 from sklearn.ensemble import GradientBoostingRegressor # GBDT--回归 from sklearn.model_selection import GridSearchCV # 网格搜索 clf_gbdt = GradientBoostingClassifier() # 定义模型实例 clf_gbdt.fit(X, y) # 训练模型 clf_gbdt.predict(X) # 样本对应各个类别预测标签 clf_gbdt.predict_proba(X) # 样本对应各个类别的概率 param_grid = {'n_estimators':range(20,81,10), 'learning_rate':[0.01, 0.05,0.1,0.5], 'max_depth':range(3,14,2), 'min_samples_split':range(100,801,200), 'min_samples_leaf':range(60,101,10), 'max_features':range(3,11,2), 'subsample':[0.6,0.7,0.75,0.8,0.85,0.9]} grid_search_gbdt = GridSearchCV(clf_gbdt, param_grid = param_grid, scoring='roc_auc',cv=5) grid_search_gbdt.fit(X,y) grid_search_gbdt.best_score_ # 获取最高分 grid_search_gbdt.best_params_ # 获取被搜索的最好参数 grid_search_gbdt.best_estimator_ # 获取最佳估计器(带所有参数的值)

1.3.2、参数详解(部分)

参数类型
参数
含义
默认值
类型
可选项
选择经验
框架参数
n_estimators
弱学习器的最大迭代次数
100
int
框架参数
learning_rate
学习率
0.1
float
(0,1]
通常我们用步长和迭代最大次数一起来决定算法的拟合效果
框架参数
subsample
子采样样本比例
1
float
(0,1]
随机森林使用的是放回抽样,而这里是不放回抽样 推荐在[0.5, 0.8]之间,默认是1.0,即不使用子采样
框架参数
init
没看懂,可以不用管
框架参数
criterion
划分子树的评估标准
friedman_mse
str
friedman_mse squared_error
推荐默认
框架参数
loss
损失函数
log_loss
str
log_loss:对数损失 deviance:似然损失函数 exponential:指数损失函数
指数损失函数等于把我们带到了Adaboost算法
弱学习器参数
max_depth
树的最大深度
3
int
[3, 5, 8, 15, 25, 30, None]
弱学习器参数
max_features
树划分时最大特征数
sqrt
str or int or float
int:整数n个特征 float:n_features * float 个特征 auto:sqrt(n_features) sqrt:sqrt(n_features),同上 log2:log2(n_features) None
推荐默认 特征小于50,用"None"就可以了
弱学习器参数
min_samples_split
分割内部节点所需最小样本数
2
int or float
int:整数n个样本 float:n_sample * float 个样本
如果样本量数量级非常大,则推荐增大这个值。 [1, 2, 5, 10, 15, 100]
弱学习器参数
min_samples_leaf
分割叶子节点所需最少样本数
1
int or float
int:整数n个样本 float:n_sample * float 个样本
如果样本量数量级非常大,则推荐增大这个值。 [1, 2, 5, 10]
弱学习器参数
min_weight_fraction_leaf
叶子节点最小的样本权重和
0
float
[0.0, 0.5]
弱学习器参数
max_leaf_nodes
最大叶子节点数
None
int
[2, inf)

1.4、XGBoost

1.5、LightGBM

1.5.1、接口调用

1.5.1.1、原生接口调用
# import lightgbm as lgb from lightgbm import plot_importance from sklearn.datasets import load_iris from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split lightgbm.train(params, train_set, num_boost_round=100, valid_sets=None, valid_names=None, fobj=None, feval=None, init_model=None, feature_name='auto', categorical_feature='auto', early_stopping_rounds=None, evals_result=None, verbose_eval=True, learning_rates=None, keep_training_booster=False, callbacks=None) """ params:参数 train_set:训练数据,需要用特定方式转换,详见下文 num_boost_round:最大迭代次数,默认10 valid_sets:用于评估的数据及数据的名称,列表类型, fobj:指定二阶可导的自定义目标函数 feval:自定义评估函数 categorical_feature:指定哪些是类别特征 early_stopping_rounds:指定迭代多少次没有得到优化则停止训练,默认值为None,表示不提前停止训练。 verbose_eval:可以是bool类型,也可以是整数类型。如果设置为整数,则每间隔verbose_eval次迭代就输出一次信息。 init_model:加载之前训练好的 lgb 模型,用于增量训练。 """ # 加载鸢尾花数据集 iris = load_iris() X,y = iris.data,iris.target # 数据集分割 X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=123457) # 构造训练集 dtrain = lgb.Dataset(X_train,y_train) dtest = lgb.Dataset(X_test,y_test) # 参数 params = { 'booster': 'gbtree', 'objective': 'multiclass', 'num_class': 3, 'num_leaves': 31, 'subsample': 0.8, 'bagging_freq': 1, 'feature_fraction ': 0.8, 'slient': 1, 'learning_rate ': 0.01, 'seed': 0 } # xgboost模型训练 model = lgb.train(params,dtrain, num_boost_round=100, valid_sets=[dtrain, dtest], verbose_eval=100, early_stopping_rounds=30) # 对测试集进行预测 y_pred = model.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, np.argmax(y_pred, axis=1)) print('accuarcy:%.2f%%'%(accuracy*100)) # 显示重要特征 plot_importance(model)
1.5.1.2、sklearn风格接口调用
import matplotlib.pyplot as plt from lightgbm import LGBMClassifier from lightgbm import plot_importance from sklearn.datasets import load_iris from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split # 加载样本数据集 iris = load_iris() X,y = iris.data,iris.target X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=12343) crf_lgbm = LGBMClassifier( max_depth=3, learning_rate=0.1, n_estimators=200, # 使用多少个弱分类器 objective='multiclass', num_class=3, booster='gbtree', min_child_weight=2, subsample=0.8, colsample_bytree=0.8, reg_alpha=0, reg_lambda=1, seed=0 # 随机数种子 ) crf_lgbm.fit(X_train,y_train, eval_set=[(X_train, y_train), (X_test, y_test)], verbose=100, early_stopping_rounds=50) # 对测试集进行预测 y_pred = crf_lgbm.predict(X_test) y_proba = crf_lgbm.predict_proba(X_test) #计算准确率 accuracy = accuracy_score(y_test,y_pred) print('accuracy:%3.f%%'%(accuracy*100)) # 显示重要特征 plot_importance(model) plt.show()

1.5.2、参数详解

参数类型
参数
含义
默认值
类型
可选项
选择经验
learning_rate / eta
学习率
0.1
float
[0.01, 0.015, 0.025, 0.05, 0.1]
boosting_type
估计器
gbdt
str
gbdt、dart、rf、goss
推荐默认
根据场景确定
objective
学习目标
regression
str or None
regression:L2正则项的回归(回归) regression_l1:L1正则项的回归(回归) mape:平均绝对百分比误差(回归) binary:二分类 log loss(分类) multiclass:多分类 softmax(分类) multiclassova:多分类 one vs all(分类) lambdarank:排序(排序) ……
根据场景确定
num_class
多分类问题的类别个数
根据场景确定
is_unbalance / unbalanced_sets
是否平衡样本
false
bool
根据场景确定
metric
评估指标
{l2 for regression}, {binary_logloss for binary classification}, {ndcg for lambdarank}
str or list
回归任务:mae、mse、rmse 二分类:auc、binary、binary_logloss、binary_error 多分类:multiclass、multi_logloss、multi_error
搜索调参
n_estimators
迭代次数
100
int
搜索调参
num_leaves
叶子的个数
31
应该小于
搜索调参
max_depth
树的最大深度
-1(不做限制)
[3, 5, 6, 7, 9, 12, 15, 17, 25]
搜索调参
min_data_in_leaf / min_child_samples
叶子节点数据的最小数量
20
min_sum_hessian_in_leaf / min_child_weight
指定孩子节点中最小的样本权重和
1e-3
[1, 3, 5, 7],如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束
搜索调参
colsample_bytree / feature_fraction
特征随机采样的比例
1
[0.6, 0.7, 0.8, 0.9, 1]
搜索调参
subsample / bagging_fraction
样本随机采样的比例
1
bagging_freq 设置为非0值时才生效
[0.6, 0.7, 0.8, 0.9, 1]
bagging_freq / subsample_freq
禁用样本采样
0
搜索调参
lambda_l1 / reg_alpha
0
[0, 0.1, 0.5, 1]
搜索调参
lambda_l2 / reg_lambda
L2正则化权重项
0
[0, 0.1, 0.5, 1],增加此值将使模型更加保守。
min_gain_to_split / min_split_gain
执行切分的最小增益
0
[0, 0.05 ~ 0.1, 0.3, 0.5, 0.7, 0.9, 1],设置的值越大,模型就越保守
seed / random_state
随机数种子
max_bin
特征值将被归入的最大仓位数
255
int
max_bin > 1
LightGBM会根据max_bin自动压缩内存,数值越大越耗时
verbosity
控制日志的详细程度
1
int
<0:打印报错信息,随便给个负数 =0:打印警告信息,0 =1:打印日志信息,1 >1:Debug调试模式,随便给个正数
放在fit()方法中才会生效

1.5.3、调参实例

一般来说,开始选择一个较小的步长来网格搜索最好的迭代次数。
clf_lgbm = lgbm.LGBMClassifier( boosting_type='gbdt', # 第一步 根据场景固定部分参数 objective='binary', metric='auc', verbose=-1, learning_rate=0.1, # 第二步 学习率和迭代次数一起调 0.666700429456532 n_estimators=200, max_depth=5, # 第三步调 {max_depth,num_leaves}, 0.6708004303847365 num_leaves=20, min_data_in_leaf=50, # 第四步调 min_data_in_leaf, 0.6728529685838128 bagging_fraction=0.7, # 第五步调 {bagging_fraction,feature_fraction}, 0.6728529685838128 feature_fraction=1, # lambda_l1=1, # 第六步调 {lambda_l1,lambda_l2}, 0.6714313656366919 # lambda_l2=1, # learning_rate=0.1, # 第七步调, learning_rate, 最佳0.1, 0.6714313656366919 ) param_grid = { # 'n_estimators': range(100,501 ,100), # 'max_depth': range(1, 6, 1), # 'num_leaves':range(15, 36, 5), # 'min_data_in_leaf': range(20, 80, 10), # 'feature_fraction': [0.7,0.8,0.9,1.0], # 'bagging_fraction': [0.7,0.8,0.9,1.0], 'lambda_l1': [1e-5,1e-1,0.0,0.1,0.5,1.0], 'lambda_l2': [1e-5,1e-1,0.0,0.1,0.5,1.0], # 'learning_rate': [0.01, 0.015, 0.025, 0.05, 0.1] } gs_lgbm = GridSearchCV(clf_lgbm, param_grid=param_grid, scoring='roc_auc') gs_lgbm.fit(train_data_array, train_label) print('最优参数组合:',gs_lgbm.best_params_) print('最优参数分数:',gs_lgbm.best_score_) # print(gs_lgbm.scorer_)

1.5.4、特征重要性

boost = clf_lgbm.booster_ pd.DataFrame({ 'column': train_data_value_all_df.columns, 'importance': boost.feature_importance(), }).sort_values(by='importance')

1.5.5、参考文档

二、聚类算法

# 划分聚类 from sklearn.cluster import KMeans # KMeans聚类 from sklearn.cluster import MiniBatchKMeans # KMeans聚类大样本优化 # 层次聚类 from sklearn.cluster import Birch # 密度聚类 from sklearn.cluster import DBSCAN from sklearn.cluster import OPTICS # 谱聚类 from sklearn.cluster import SpectralClustering
不严谨对比
聚类算法
运行效率
适合数据
KMeans
O(n * K * I * d) n是数据量 K簇的数量 I是迭代次数 d是数据维度
非凸数据效果不佳 对于噪声敏感 需指定簇的数量
MiniBatchKMeans
O(n * K * I * d)
由于使用小批量数据,计算速度更快。 适用于大规模数据集,对于较大的K和高维数据表现较好。
Birch
O(n)
非凸数据效果不佳 适用于大规模数据集 适合类别数比较多的数据集 对噪声不敏感 不适合特征维数较高的数据集
DBSCAN
O(n * log(n))
适用于各种密度和不规则形状的数据集, 不需要提前指定簇的数量。 对噪声不敏感
OPTICS
O(n * log(n))
可以在不指定密度阈值的情况下自适应地发现簇。
SpectralClustering
O(n^3)
稀疏数据、适用于小到中等规模的数据集

2.1、KMeans聚类

2.1.1、概述

计算样本点与类簇质心的距离,与类簇质心相近的样本点划分为同一类簇。k‐均值通过样本间的距离来衡量它们之间的相似度,两个样本距离越远,则相似度越低,否则相似度越高。
💡
算法流程:
  • 选择 K 个初始质心(K需要用户指定),初始质心随机选择即可,每一个质心为一个类
  • 对剩余的每个样本点,计算它们到各个质心的欧式距离,并将其归入到相互间距离最小的质心所在的簇。计算各个新簇的质心。
  • 在所有样本点都划分完毕后,根据划分情况重新计算各个簇的质心所在位置,然后迭代计算各个样本点到各簇质心的距离,对所有样本点重新进行划分
  • 重复2. 和 3.,直到质心不在发生变化时或者到达最大迭代次数时
💡
优点:
  • 原理简单,容易实现,且运行效率比较高
  • 结果容易解释,适用于高维数据的聚类
缺点:
  • K值的选取不好把握
  • 采用贪心策略,导致容易局部收敛,在大规模数据集上求解较慢
  • 对离群点和噪声点非常敏感,少量的离群点和噪声点可能对算法求平均值产生极大影响,从而影响聚类结果
  • 初始聚类中心的选取也对算法结果影响很大,不同的初始中心可能会导致不同的聚类结果

2.1.2、示例&调参

from sklearn.cluster import KMeans from sklearn import datasets iris = datasets.load_iris() # 加载数据 X = iris.data y = iris.target est = KMeans(n_clusters=3) # 定义模型 y_pred = est.fit_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, 2, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1], dtype=int32) """

2.1.3、参数详解(部分)

参数
含义
默认值
类型
可选项
选择经验
n_clusters
k值,聚几类
8
int
max_iter
最大的迭代次数
300
int
一般如果是凸数据集的话可以不管这个值,如果数据集不是凸的,可能很难收敛,此时可以指定最大的迭代次数让算法可以及时退出循环。
n_init
用不同的初始化质心运行算法的次数
10
‘auto’ or int
由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,一般不需要改。如果你的k值较大,则可以适当增大这个值。
init
初始值选择的方式
k-means++
k-means++(初始化优化) random 自定义初始化的k个质心
一般建议使用默认的'k-means++'。
algorithm
算法选择
lloyd
“lloyd”: “elkan”:elkan K-Means算法(距离计算优化) “auto”:弃用 “full”:弃用
一般数据是稠密的,那么就是 “elkan”,否则就是"lloyd"。一般来说建议直接用默认的"lloyd”
💡
K值的选取:
通过评估聚类的结果来选择K值,聚类结果的评估通常有轮廓系数(Silhouette Coefficient)和CH(Calinski-Harabasz Index)。详见 2.5、聚类模型评估

2.1.4、大样本优化Mini Batch K-Means

在统的K-Means算法中,要计算所有的样本点到所有的质心的距离。如果样本量非常大,比如达到10万以上,特征有100以上,此时用传统的K-Means算法非常的耗时,就算加上elkan K-Means优化也依旧。在大数据时代,这样的场景越来越多。此时Mini Batch K-Means应运而生。顾名思义,Mini Batch,也就是用样本集中的一部分的样本来做传统的K-Means,这样可以避免样本量太大时的计算难题,算法收敛速度大大加快。当然此时的代价就是我们的聚类的精确度也会有一些降低。一般来说这个降低的幅度在可以接受的范围之内。
在Mini Batch K-Means中,我们会选择一个合适的批样本大小batch size,我们仅仅用batch size个样本来做K-Means聚类。那么这batch size个样本怎么来的?一般是通过无放回的随机采样得到的。为了增加算法的准确性,我们一般会多跑几次Mini Batch K-Means算法,用得到不同的随机采样集来得到聚类簇,选择其中最优的聚类簇。也可以使用MiniBatchKMeans的增量学习进行训练
示例&调参
from sklearn.cluster import MiniBatchKMeans import numpy as np X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 0], [4, 4], [4, 5], [0, 1], [2, 2], [3, 2], [5, 5], [1, -1]]) # manually fit on batches kmeans = MiniBatchKMeans(n_clusters=2, random_state=0, batch_size=6, n_init="auto") kmeans = kmeans.partial_fit(X[0:6,:]) # 增量学习 kmeans = kmeans.partial_fit(X[6:12,:]) kmeans.cluster_centers_ kmeans.predict([[0, 0], [4, 4]]) # 聚类
参数详解
参数
含义
默认值
类型
可选项
选择经验
n_clusters
k值,聚几类
8
int
max_iter
最大的迭代次数
100
int
一般如果是凸数据集的话可以不管这个值,如果数据集不是凸的,可能很难收敛,此时可以指定最大的迭代次数让算法可以及时退出循环。
n_init
用不同的初始化质心运行算法的次数
3
‘auto’ or int
由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,一般不需要改。如果你的k值较大,则可以适当增大这个值。
init
初始值选择的方式
k-means++
k-means++(初始化优化) random 自定义初始化的k个质心
一般建议使用默认的'k-means++'。
batch_size
用来跑Mini Batch KMeans算法的采样集的大小
1024
int
reassignment_ratio
某个类别质心被重新赋值的最大次数比例
0.01
float
这个比例是占样本总数的比例,乘以样本总数就得到了每个类别质心可以重新赋值的次数。如果取值较高的话算法收敛时间可能会增加,尤其是那些暂时拥有样本数较少的质心。默认是0.01。如果数据量不是超大的话,比如1w以下,建议使用默认值。如果数据量超过1w,类别又比较多,可能需要适当减少这个比例值。具体要根据训练集来决定。
max_no_improvement
连续多少个Mini Batch没有改善聚类效果的话,就停止算法
10
int

2.1.5、参考文章

2.2、BIRCH聚类

2.2.1、概述

💡
层次聚类
层次聚类算法可以揭示数据的分层结构,在树形结构上不同层次进行划分,可以得到不同粒度的聚类结果。按照层次聚类的过程分为自底向上的聚合聚类和自顶向下的分裂聚类。聚合聚类以AGNES、BIRCH、ROCK等算法为代表,分裂聚类以DIANA算法为代表。
  • 自底向上的聚合聚类将每个样本看作一个簇,初始状态下簇的数目等于样本的数目,然后然后根据一定的算法规则,例如把簇间距离最小的相似簇合并成越来越大的簇,直到满足算法的终止条件。
  • 自顶向下的分裂聚类先将所有样本看作属于同一个簇,然后逐渐分裂成更小的簇,直到满足算法终止条件为止。
BIRCH的全称是利用层次方法的平衡迭代规约和聚类(Balanced Iterative Reducing and Clustering Using Hierarchies)
💡
优点:
  • 节约内存,所有的样本都在磁盘上,CF Tree仅仅存了CF节点和对应的指针。
  • 聚类速度快,只需要一遍扫描训练集就可以建立CF Tree,CF Tree的增删改都很快。
  • 可以识别噪音点,还可以对数据集进行初步分类的预处理
缺点:
  • 由于CF Tree对每个节点的CF个数有限制,导致聚类的结果可能和真实的类别分布不同.
  • 对高维特征的数据聚类效果不好。此时可以选择Mini Batch K-Means
  • 如果数据集的分布簇不是类似于超球体,或者说不是凸的,则聚类效果不好。

2.2.2、示例&调参

from sklearn.cluster import Birch X = [[0, 1], [0.3, 1], [-0.3, 1], [0, -1], [0.3, -1], [-0.3, -1]] brc = Birch(n_clusters=None) brc.fit(X) brc.predict(X)

2.2.3、参数详解

参数
含义
默认值
类型
可选项
选择经验
threshold
叶节点每个CF的最大样本半径阈值T
0.5
float
0到正无穷
一般来说threshold越小,则CF Tree的建立阶段的规模会越大,即BIRCH算法第一阶段所花的时间和内存会越多。
branching_factor
CF Tree内部节点的最大CF数B,以及叶子节点的最大CF数L
50
int
如果样本量非常大,比如大于10万,则一般需要增大这个默认值。选择多大的branching_factor以达到聚类效果则需要通过和threshold一起调参决定
n_clusters
类别数K
3
None,int
不输入K,则BIRCH会对CF Tree里各叶子节点CF中样本的情况自己决定类别数K值,如果输入K值,则BIRCH会CF Tree里各叶子节点CF进行合并,直到类别数为K。
compute_labels
是否标示类别输出
True
bool

2.2.4、参考文章:

2.3、DBSCAN聚类

2.3.1、概述

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法
该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。
和传统的K-Means算法相比,DBSCAN最大的不同就是不需要输入类别数k,当然它最大的优势是可以发现任意形状的聚类簇,而不是像K-Means,一般仅仅使用于凸的样本集聚类。同时它在聚类的同时还可以找出异常点,这点和BIRCH算法类似。那么我们什么时候需要用DBSCAN来聚类呢?一般来说,如果数据集是稠密的,并且数据集不是凸的,那么用DBSCAN会比K-Means聚类效果好很多。如果数据集不是稠密的,则不推荐用DBSCAN来聚类。
💡
优点:
1) 可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。
2) 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
3) 聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。
缺点:
1)如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。
2) 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。
3) 调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。

2.3.2、示例&调参

from sklearn.cluster import DBSCAN y_pred = DBSCAN(eps=0.1, min_samples=10).fit_predict(X)
eps和min_samples需要进行联合调参

2.3.3、参数详解

参数
含义
默认值
类型
可选项
选择经验
eps
ϵ-邻域的距离阈值
0.5
float
eps过大,则更多的点会落在核心对象的ϵ-邻域,此时我们的类别数可能会减少, 本来不应该是一类的样本也会被划为一类。反之则类别数可能会增大,本来是一类的样本却被划分开。
min_samples
邻域最小样本数
5
int
在eps一定的情况下,min_samples过大,则核心对象会过少,此时簇内部分本来是一类的样本可能会被标为噪音点,类别数也会变多。反之min_samples过小的话,则会产生大量的核心对象,可能会导致类别数过少。
metric
最近邻距离度量参数
euclidean
euclidean:欧式距离 manhattan:曼哈顿距离 chebyshev:切比雪夫距离 minkowski:闵可夫斯基距离
推荐默认

2.3.4、OPTICS聚类

详见:OPTICS聚类

2.3.5、参考文章

2.4、谱聚类

2.4.1、概述

谱聚类是从图论中演化出来的算法,后来在聚类中得到了广泛的应用。它的主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,通过对所有数据点组成的图进行切图,让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的。
刘建平大佬的建议:在处理实际的聚类问题时,个人认为谱聚类是应该首先考虑的几种算法之一。
💡
优点:
1)谱聚类只需要数据之间的相似度矩阵,因此对于处理稀疏数据的聚类很有效。这点传统聚类算法比如K-Means很难做到
2)由于使用了降维,因此在处理高维数据聚类时的复杂度比传统聚类算法好。
缺点:
1)如果最终聚类的维度非常高,则由于降维的幅度不够,谱聚类的运行速度和最后的聚类效果均不好。
2) 聚类效果依赖于相似矩阵,不同的相似矩阵得到的最终聚类效果可能很不同。

2.4.2、示例&调参

import numpy as np from sklearn import datasets X, y = datasets.make_blobs(n_samples=500, n_features=6, centers=5, cluster_std=[0.4, 0.3, 0.4, 0.3, 0.4], random_state=11) from sklearn.cluster import SpectralClustering y_pred = SpectralClustering().fit_predict(X) from sklearn import metrics print("Calinski-Harabasz Score", metrics.calinski_harabasz_score(X, y_pred)) for index, gamma in enumerate((0.01,0.1,1,10)): for index, k in enumerate((3,4,5,6)): y_pred = SpectralClustering(n_clusters=k, gamma=gamma).fit_predict(X) print("Calinski-Harabasz Score with gamma=", gamma, "n_clusters=", k,"score:", metrics.calinski_harabasz_score(X, y_pred))
需要对k和gamma进行联合调参

2.4.3、参数详解

参数
含义
默认值
类型
可选项
选择经验
n_clusters
谱聚类切图时降维到的维数 也是最后聚类的类别数
8
int
可选的,但是一般还是推荐调参选择最优参数。
affinity
相似矩阵的建立方式
rbf
str or callable
推荐使用默认的高斯核函数。是用高斯核函数需要对gamma进行调参
gamma
核函数参数
1.0
float

2.4.4、参考文章

2.5、聚类模型评估

2.5.1、CH评估

CH(Calinski-Harabasz Index)指标通过计算类中各点与类中心的距离平方和来度量类内的紧密度,通过计算各类中心点与数据集中心点距离平方和来度量数据集的分离度,CH指标由分离度与紧密度的比值得到。从而,CH越大代表着类自身越紧密,类与类之间越分散,即更优的聚类结果
from sklearn import metrics metrics.calinski_harabaz_score(X, y_pred)

2.5.2、轮廓系数

轮廓系数(Silhouette Coefficient)取值范围为[-1,1],取值越接近1则说明聚类性能越好,相反,取值越接近-1则说明聚类性能越差。
from sklearn import metrics metrics.silhouette_samples(X, y_pred, etric='euclidean') """ metric : 计算要素阵列中实例之间的距离时使用的度量。默认是euclidean(欧氏距离)。 如果metric是字符串,则必须是允许的选项之一metrics.pairwise.pairwise_distances。如果X是距离数组本身,请使用metric="precomputed"。 """

三、降维算法

from sklearn.decomposition import PCA from sklearn.decomposition import KernelPCA from sklearn.decomposition import IncrementalPCA from sklearn.decomposition import SparsePCA from sklearn.decomposition import MiniBatchSparsePCA from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.manifold import LocallyLinearEmbedding from sklearn.manifold import TSNE
算法
适用场景
PCA
传统机器学习场景
LDA
带标签数据 图形图像识别领域
LLE
高维数据可视化 图形图像识别领域
TSNE
高维数据可视化

3.1、PCA主成分分析

3.1.1、概述

PCA顾名思义,就是找出数据里最主要的方面,用数据里最主要的方面来代替原始数据。数据维度降低,信息肯定会有损失,但是我们希望损失尽可能的小。假设存在一个线性的超平面,可以让我们对数据进行投影。降维的标准为:样本点到这个超平面的距离足够近,或者说样本点在这个超平面上的投影能尽可能的分开。
💡
算法流程:
notion image
💡
优点:
  • 仅仅需要以方差衡量信息量,不受数据集以外的因素影响。
  • 各主成分之间正交,可消除原始数据成分间的相互影响的因素。
  • 计算方法简单,主要运算是特征值分解,易于实现。
缺点:
  • 主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强。
  • 方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。

3.1.2、示例

创建数据
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits import mplot3d %matplotlib inline from sklearn.datasets import make_blobs # X为样本特征,Y为样本簇类别, 共1000个样本,每个样本3个特征,共4个簇 X, y = make_blobs(n_samples=10000, n_features=3, centers=[[3,3, 3], [0,0,0], [1,1,1], [2,2,2]], cluster_std=[0.2, 0.1, 0.2, 0.2], random_state =9) fig = plt.figure() ax = plt.axes(projection='3d') ax.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o')
notion image
from sklearn.decomposition import PCA pca = PCA(n_components=3) # 数据本来就是三维,如果降维后的维度也设置为3,则是单纯的对数据投影,可以通过此方法查看特征方差分布 pca.fit(X) print(pca.explained_variance_ratio_) # 各特征的方差值占比 print(pca.explained_variance_) # 各特征的方差值 """ [0.98318212 0.00850037 0.00831751] [3.78521638 0.03272613 0.03202212] """

3.1.3、参数

pac最主要的参数就是n_components,该参数的含义是要保存的特征数量或方差占比总和

3.1.4、PCA对比

PCA种类
区别
API
调参
PCA
线性数据的降维
from sklearn.decomposition import PCA
KernelPCA
非线性数据的降维,需要用到核技巧
from sklearn.decomposition import KernelPCA
核函数的参数进行调参
IncrementalPCA
解决单机内存限制,将数据分成多个batch,然后对每个batch依次递增调用partial_fit函数
from sklearn.decomposition import IncrementalPCA
n_components只能是整数
SparsePCA
使用L1正则化,将非主要成分的影响度降为0,只需要对主要的成分进行PCA降维,避免噪声影响
from sklearn.decomposition import SparsePCA
对L1正则化参数进行调参
MiniBatchSparsePCA
使用L1正则化, 通过使用一部分样本特征和给定的迭代次数来进行PCA降维,以解决在大样本时特征分解过慢的问题,代价就是PCA降维的精确度可能会降低
from sklearn.decomposition import MiniBatchSparsePCA
对L1正则化参数进行调参

3.2、LDA线性判别

LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的。
LDA的思想可以用一句话概括,就是“投影后类内方差最小,类间方差最大”。
LDA选择分类性能最好的投影方向,而PCA选择样本点投影具有最大方差的方向。
LDA降维最多降到类别数k-1的维数,而PCA没有这个限制。
LDA在模式识别领域(比如人脸识别,舰艇识别等图形图像识别领域)中有非常广泛的应用
import numpy as np from sklearn.discriminant_analysis import LinearDiscriminantAnalysis X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) y = np.array([1, 1, 1, 2, 2, 2]) lda = LinearDiscriminantAnalysis(n_components=1) lda.fit(X, y) X_new = lda.transform(X)
参数
含义
默认值
类型
可选项
选择经验
n_components
降维后的维度
None
int
[1,类别数-1)
如果不是用于降维,则这个值可以用默认的None。
solver
求LDA超平面特征矩阵使用的方法
svd
str
奇异值分解"svd" 最小二乘"lsqr" 特征分解"eigen”
"eigen"。一般来说特征数非常多的时候推荐使用svd,而特征数不多的时候推荐使用eigen
priors
类别权重
None
array-like of shape (n_classes,)
降维时一般不需要关注这个参数
shrinkage
正则化参数
None
‘auto’ or float,
降维时一般不需要关注这个参数
一般来说,如果我们的数据是有类别标签的,那么优先选择LDA去尝试降维;当然也可以使用PCA做很小幅度的降维去消去噪声,然后再使用LDA降维。如果没有类别标签,那么肯定PCA是最先考虑的一个选择了。

3.3、LLE局部线性嵌入

由于LLE在降维时保持了样本的局部特征,它广泛的用于图像图像识别,高维数据可视化等领域。
LLE是广泛使用的图形图像降维方法,它实现简单,但是对数据的流形分布特征有严格的要求。比如不能是闭合流形,不能是稀疏的数据集,不能是分布不均匀的数据集等等。所以不常用
from sklearn.datasets import load_digits from sklearn.manifold import LocallyLinearEmbedding X, _ = load_digits(return_X_y=True) X.shape embedding = LocallyLinearEmbedding(n_components=2) X_transformed = embedding.fit_transform(X[:100]) X_transformed.shape

3.4、tSNE T分布随机近邻嵌入

tSNE是一种降维技术,即将多维数据非线性的转换为低纬数据。形式上和PCA很像,根本差异在于PCA主要用于数据处理,即PCA在实现数据降维的同时,也实现了噪音去除;而tSNE主要用于数据展示,即将不能可视化的多维数据降维到低维(如2维),进行数据可视化展示。另外PCA是线性的,可对新的test数据进行同样的降维处理,而tSNE是非线性的,不能对新的test数据进行同样的降维处理。
import numpy as np from sklearn.manifold import TSNE X = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]]) X_embedded = TSNE(n_components=2, learning_rate='auto', init='random', perplexity=3).fit_transform(X) X_embedded.shape

四、关联规则算法

4.1、Apriori

Apriori 算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合的模式有助于我们做一些决策。
但是scikit-learn中并没有频繁集挖掘相关的算法类库,常用的关联规则算法库为mlxtendefficient-apriori库 ,但是这两个库都只有apriori算法的实现 。详见Apriori

4.2、FP Tree

Apriori算法需要多次扫描数据,I/O是很大的瓶颈。为了解决这个问题,FP Tree算法(也称FP Growth算法)采用了一些技巧,无论多少数据,只需要扫描两次数据集,因此提高了算法运行的效率。

4.3、PrefixSpan

序列数据的频繁项集挖掘。
比如第一个序列<a(abc)(ac)d(cf)>,它由a,abc,ac,d,cf共5个项集数据组成,并且这些项有时间上的先后关系。对于多于一个项的项集我们要加上括号,以便和其他的项集分开。同时由于项集内部是不区分先后顺序的,为了方便数据处理,我们一般将序列数据内所有的项集内部按字母顺序排序。
 
持续更新中,敬请期待!!!
 

  • Twikoo
  • Giscus
  • GitTalk
AnJhon
AnJhon
但知行好事,莫要问前程
公告
type
Notice
status
Published
summary
slug
date
Jul 21, 2023
tags
category
password
icon
URL
Property
Aug 4, 2023 04:45 AM
🚧🚧🚧
网站施工中~
🚧🚧🚧
📮你好,欢迎来到我的博客 🧑🏻‍💻我是Anjhon,一个学习者 📃这里记录了我的学习生活笔记 📬欢迎留言交流