准备数据集

一、数据集

Ref: 6. Dataset loading utilities【各种数据集选项】

第一部分,加载原始iris数据集的数据;

第二部分,先增加一行,再增加一列;

  1. #%% part one.
  2. from sklearn.datasets import load_iris
  3. iris = load_iris()
  4.  
  5. iris.data
  6. iris.target
  7.  
  8. print(type(iris.data))
  9. print(type(iris.target))
  10.  
  11. print()
  12. preview_line = 5
  13. print("data X is: \n{}".format(iris.data[:preview_line]))
  14. print("data Y is: \n{}".format(iris.target[:preview_line]))

  15. #%% part two
  16. from numpy import hstack, vstack, array, median, nan
  17. from numpy.random import choice

  18. ##########################################################################################
  19. # 1.特征矩阵加工
  20. # 1.1.1 使用vstack增加一行含缺失值的样本(nan, nan, nan, nan), reshape相当于升维度
  21. nan_tmp = array([nan, nan, nan, nan]).reshape(1,-1)
  22. print(nan_tmp)
  23. # 1.1.2 合并两个array
  24. iris.data = vstack((iris.data, array([nan, nan, nan, nan]).reshape(1,-1)))

  25. # 1.2.1 使用hstack增加一列表示花的颜色(0-白、1-黄、2-红),花的颜色是随机的,意味着颜色并不影响花的分类
  26. random_feature = choice([0, 1, 2], size=iris.data.shape[0]).reshape(-1,1)
  27. # 1.2.2 合并两个array
  28. iris.data = hstack((random_feature, iris.data))
  29. preview_line = 5
  30. print("data X is: \n{}".format(iris.data[:preview_line]))

  31. ##########################################################################################
  32. # 2 目标值向量加工
  33. # 2.1 增加一个目标值,对应含缺失值的样本,值为众数
  34. iris.target = hstack((iris.target, array([median(iris.target)])))

另一个写法版本,编辑器友好,但读者不友好。

  1. # Edit data
  2. iris.data = np.hstack((np.random.choice([0, 1, 2], size=iris.data.shape[0]+1).reshape(-1,1), np.vstack((iris.data, np.full(4, np.nan).reshape(1,-1)))))
  3. iris.target = np.hstack((iris.target, np.array([np.median(iris.target)])))

串行、并行流

一、串行结合并行流

有若干知识点:FeatureUnion, fit, transform, pipeline。

大概的思路是:

(1)先构建FeatureUnion,找到合适的features.

(2)再利用这些features进一步地做分类、拟合或者聚类。

  1. from sklearn.pipeline import Pipeline, FeatureUnion
  2. from sklearn.model_selection import GridSearchCV
  3. from sklearn.svm import SVC
  4. from sklearn.datasets import load_iris
  5. from sklearn.decomposition import PCA
  6. from sklearn.feature_selection import SelectKBest
  7.  
  8. iris = load_iris()
  9. X, y = iris.data, iris.target

  10. #############################################################################
  11. # This dataset is way too high-dimensional. Better do PCA:
  12. pca = PCA(n_components=2)
  13.  
  14. # 可以依据“相关性”对特征进行选择,保留k个评分最高的特征。
    selection = SelectKBest(k=1)
  1. # Build estimator from PCA and Univariate selection:
  2. combined_features = FeatureUnion([("pca", pca), ("univ_select", selection)])

  3. #############################################################################
  4. # Use combined features to transform dataset:
  5. X_features = combined_features.fit(X, y).transform(X)
  6. print("Combined space has", X_features.shape[1], "features")
  7. svm = SVC(kernel="linear")

  8. #############################################################################
    # Do grid search over k, n_components and C:
  9. pipeline = Pipeline([("features", combined_features), ("svm", svm)])
  10.  
  11. #############################################################################
    # pca, univ_select其实本来已设置,这里呢,可以设置“一组参数”, fit后找到最好的参数设置
    param_grid = dict(features__pca__n_components=[1, 2, 3],
  12. features__univ_select__k=[1, 2],
  13. svm__C=[0.1, 1, 10])
  14.  
  15. grid_search = GridSearchCV(pipeline, param_grid=param_grid, cv=5, verbose=10)
  16. grid_search.fit(X, y)
  17. print(grid_search.best_estimator_)

二、串行 Pipeline

(a) Pipleline中最后一个之外的所有estimators都必须是变换器(transformers),最后一个estimator可以是任意类型(transformer,classifier,regresser)。

transformers --> transformers --> transformers --> ... --> transformer or classifier or regresser

(b) pipeline继承最后一个estimator的所有方法。带来两点好处:

1. 直接调用fit和predict方法来对pipeline中的所有算法模型进行训练和预测。
2. 可以结合 grid search 对参数进行选择。

继承了哪些方法呢,如下:

1 transform 依次执行各个学习器的transform方法;
2 inverse_transform 依次执行各个学习器的inverse_transform方法;
3 fit 依次对前n-1个学习器执行 fit 和 transform 方法,第n个学习器 (最后一个学习器) 执行fit方法;
4 predict 执行第n个学习器的 predict方法;
5 score 执行第n个学习器的 score方法;
6 set_params 设置第n个学习器的参数;
7 get_param 获取第n个学习器的参数;

  

(c) 训练和预测时的串行工作流。

Ref: sklearn :Pipeline 与 FeatureUnion入门指南

(d) 改变pipeline的参数:set_params

  1. from sklearn.pipeline import Pipeline
  2. from sklearn.preprocessing import StandardScaler
  3. from sklearn.svm import SVC
  4. from sklearn.decomposition import PCA
  5. from sklearn.datasets import load_iris
  6. iris=load_iris()
  7. pipe=Pipeline([('sc', StandardScaler()), ('pca',PCA()),('svc',SVC())])
  8. #例如‘sc’是StandardScaler()的简称,亦或者是代称
  9. pipe.set_params(sc__copy=False)
  10. #改变参数的格式为 学习器简称__该学习器对应参数名=参数值
  11. pipe.fit(iris.data, iris.target)

该参数后,能看到pipeline类中的子函数的对应的参数也变了。

  1. #可以看到sc中的copy确实由true改为false
  2. Pipeline(memory=None,
  3. steps=[('sc', StandardScaler(copy=False, with_mean=True, with_std=True)), ('pca', PCA(copy=True, iterated_power='auto', n_components=None, random_state=None,
  4. svd_solver='auto', tol=0.0, whiten=False)), ('svc', SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  5. decision_function_shape='ovr', degree=3, gamma='auto_deprecated',
  6. kernel='rbf', max_iter=-1, probability=False, random_state=None,
  7. shrinking=True, tol=0.001, verbose=False))])

三、并行 FeatureUnion

特征联合 FeatureUnion 是个啥?与pipeline有啥区别?

    • pipeline相当于feature串行处理,后一个transformer处理前一个transformer的feature结果;
    • featureunion相当于feature的并行处理,将所有transformer的处理结果拼接成大的feature vector。

FeatureUnion提供了两种服务:

    • Convenience: 你只需调用一次fit和transform就可以在数据集上训练一组estimators。
    • Joint parameter selection: 可以把grid search用在FeatureUnion中所有的estimators的参数组合上面。

从如下例子可见:PCA和KernelPCA是同一个等级的 estimator,自然是使用 “并行” 策略。

例子一:

  1. from sklearn.pipeline import FeatureUnion
  2. from sklearn.decomposition import PCA   # transformer
  3. from sklearn.decomposition import KernelPCA  # transformer
  4. estimators = [('linear_pca',PCA()),('kernel_pca',KernelPCA())]
  5. combined = FeatureUnion(estimators)
  6. print(combined)
  7.  
  8. #FeatureUnion(n_jobs=1, transformer_list=[('linear_pca', PCA(copy=True, iterated_power='auto', n_components=None, random_state=None, svd_solver='auto', tol=0.0, whiten=False)), ('kernel_pca', KernelPCA(alpha=1.0, coef0=1, copy_X=True, degree=3, eigen_solver='auto', fit_inverse_transform=False, gamma=None, kernel='linear', kernel_params=None, max_iter=None, n_components=None, n_jobs=1, random_state=None, remove_zero_eig=False, tol=0))],transformer_weights=None)

例子二:

  1. from numpy import log1p
  2. from sklearn.preprocessing import FunctionTransformer  # transformer
  3. from sklearn.preprocessing import Binarizer # transformer
  4. from sklearn.pipeline import FeatureUnion
  5. # 新建将整体特征矩阵进行对数函数转换的对象。
  6. step2_1 = ('ToLog', FunctionTransformer(log1p))
  7. # 新建将整体特征矩阵进行二值化类的对象。
  8. step2_2 = ('ToBinary', Binarizer())
  9. # 新建整体并行处理对象。
  10. # 该对象也有fit和transform方法,fit和transform方法均是并行地调用需要并行处理的对象的fit和transform方法。
  11. # 参数transformer_list为需要并行处理的对象列表,该列表为二元组列表,第一元为对象的名称,第二元为对象。
  12. step2 = ('FeatureUnion', FeatureUnion(transformer_list=[step2_1, step2_2]))

知识点:FunctionTransformer(log1p) 基于对数函数

把原始数据取对数后进一步处理。之所以这样做是基于对数函数在其定义域内是单调增函数,取对数后不会改变数据的相对关系。

1. 缩小数据的绝对数值,方便计算。

2. 取对数后,可以将乘法计算转换称加法计算。

3. 某些情况下,在数据的整个值域中的在不同区间的差异带来的影响不同。

4. 取对数之后不会改变数据的性质和相关关系,但压缩了变量的尺度,例如800/200=4, 但log800/log200=1.2616,数据更加平稳,也消弱了模型的共线性、异方差性等。

5. 所得到的数据易消除异方差问题。

6. 在经济学中,常取自然对数再做回归,这时回归方程为 lnY=a lnX+b ,两边同时对X求导,1/Y*(DY/DX) = a*1/X, b = (DY/DX)*(X/Y) = (DY*X)/(DX*Y) = (DY/Y)/(DX/X) 这正好是弹性的定义

知识点:Binarizer() 二值化特征

使用的是歌曲的数据:对歌曲听过的次数做二值化操作,听过大于等于1的次数的设置为1,否者设置为0。

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import matplotlib as mpl
  4. import pandas as pd
  5.  
  6. plt.style.reload_library()
  7. plt.style.use('classic')
  8. # 设置颜色
  9. mpl.rcParams['figure.facecolor'] = (1, 1, 1, 0)
  10. # 设置图形大小
  11. mpl.rcParams['figure.figsize'] = (6.0, 4.0)
  12. # 设置图形的分辨率
  13. mpl.rcParams['figure.dpi'] = 100
  14. popsong_df = pd.read_csv('datasets/song_views.csv', encoding='utf-8')
  15. # 我们对listen_count听歌的次数进行二值化操作, 听过的次数大于等于1的为1,次数为0的为0
  16.  
  17. # 第一种方法
  18. # listened = popsong_df['listen_count'].copy()
  19. # listened[listened >= 1] = 1
  20. # popsong_df['listened'] = listened
  21. # print(popsong_df[['listen_count', 'listened']])

  22. # 第二种方法:使用 Binarizer
  23. from sklearn.preprocessing import Binarizer
  24. bin = Binarizer(threshold=0.9)
  25. popsong_df['listened'] = bin.transform( popsong_df['listen_count'].values.reshape(-1, 1) )
  26. print(popsong_df[['listen_count', 'listened']].iloc[:10])

在这里,为了满足 .transform() 的要求,参数需通过 reshape 变为 “小列表” 元素的形式。

  1. In [12]: df['score'].values
  2. Out[12]: array([1, 4])
  3.  
  4. In [13]: df['score'].values.reshape(-1,1) # 需要这个形式,然后给 bin.transform
  5. Out[13]:
  6. array([[1],
  7. [4]])

四、"部分并行”处理

使用需求

整体并行处理有其缺陷,在一些场景下,我们只需要对特征矩阵的某些列进行转换,而不是所有列。

pipeline并没有提供相应的类(仅OneHotEncoder类实现了该功能),需要我们在FeatureUnion的基础上进行优化。

使用方法

(1) 这里自定义并使用了 FeatureUnionExt(...) 函数接口,用起来比较方便。

  1. from numpy import log1p
  2. from sklearn.preprocessing import OneHotEncoder
  3. from sklearn.preprocessing import FunctionTransformer
  4. from sklearn.preprocessing import Binarizer
  5.  
  6. #新建将部分特征矩阵进行定性特征编码的对象
  7. step2_1 = ('OneHotEncoder', OneHotEncoder(sparse=False))
  8. #新建将部分特征矩阵进行对数函数转换的对象
  9. step2_2 = ('ToLog', FunctionTransformer(log1p))
  10. #新建将部分特征矩阵进行二值化类的对象
  11. step2_3 = ('ToBinary', Binarizer())
  12.  
  13. #新建部分并行处理对象
  14. #参数transformer_list为需要并行处理的对象列表,该列表为二元组列表,第一元为对象的名称,第二元为对象
  15. #参数idx_list为相应的需要读取的特征矩阵的列
  16. step2 = ('FeatureUnionExt', FeatureUnionExt(transformer_list=[step2_1, step2_2, step2_3], idx_list=[[0], [1, 2, 3], [4]]))

(2) 这里对 FeatureUnionExt(...) 函数接口 进行了实现,重点是使用了 Parallel方法。【实现使用的老版本,调试请参考github中新版本】

  1. from sklearn.pipeline import FeatureUnion, _fit_one_transformer, _fit_transform_one, _transform_one
  2. from sklearn.externals.joblib import Parallel, delayed
  3. from scipy import sparse
  4. import numpy as np

  5. # 部分并行处理,继承FeatureUnion
  6. class FeatureUnionExt(FeatureUnion):
  7. # 相比FeatureUnion,多了idx_list参数,其表示每个 "并行工作" 需要读取的特征矩阵的列。
  8. def __init__(self, transformer_list, idx_list, n_jobs=1, transformer_weights=None):
  9. self.idx_list = idx_list
  10. FeatureUnion.__init__(self, transformer_list=map(lambda trans:(trans[0], trans[1]), transformer_list), n_jobs=n_jobs, transformer_weights=transformer_weights)
  11.  
  12. # 由于只部分读取特征矩阵,方法fit_transform需要重构
  13. def fit_transform(self, X, y=None, **fit_params):
  14. transformer_idx_list = map(lambda trans, idx:(trans[0], trans[1], idx), self.transformer_list, self.idx_list)
  15. result = Parallel(n_jobs=self.n_jobs)(
  16. #从特征矩阵中提取部分输入fit_transform方法
  17. delayed(_fit_transform_one)(trans, name, X[:,idx], y,
  18. self.transformer_weights, **fit_params)
  19. for name, trans, idx in transformer_idx_list)
  20.  
  21. Xs, transformers = zip(*result)
  22. self._update_transformer_list(transformers)
  23. if any(sparse.issparse(f) for f in Xs):
  24. Xs = sparse.hstack(Xs).tocsr()
  25. else:
  26. Xs = np.hstack(Xs)
  27. return Xs
  28.  
  29. ... 其他代码,略

五、流水线处理

  1. from numpy import log1p
  2. from sklearn.preprocessing import Imputer
  3. from sklearn.preprocessing import OneHotEncoder
  4. from sklearn.preprocessing import FunctionTransformer
  5. from sklearn.preprocessing import Binarizer
  6. from sklearn.preprocessing import MinMaxScaler
  7. from sklearn.feature_selection import SelectKBest
  8. from sklearn.feature_selection import chi2
  9. from sklearn.decomposition import PCA
  10. from sklearn.linear_model import LogisticRegression
  11. from sklearn.pipeline import Pipeline
  12.  
  13. #新建计算缺失值的对象
  14. step1 = ('Imputer', Imputer())
  15. #新建将部分特征矩阵进行定性特征编码的对象
  16. step2_1 = ('OneHotEncoder', OneHotEncoder(sparse=False))
  17. #新建将部分特征矩阵进行对数函数转换的对象
  18. step2_2 = ('ToLog', FunctionTransformer(log1p))
  19. #新建将部分特征矩阵进行二值化类的对象
  20. step2_3 = ('ToBinary', Binarizer())
    #新建部分并行处理对象,返回值为每个并行工作的输出的合并
  21. step2 = ('FeatureUnionExt', FeatureUnionExt(transformer_list=[step2_1, step2_2, step2_3], idx_list=[[0], [1, 2, 3], [4]]))
  22. #新建无量纲化对象
  23. step3 = ('MinMaxScaler', MinMaxScaler())
  24. #新建卡方校验选择特征的对象
  25. step4 = ('SelectKBest', SelectKBest(chi2, k=3))
  26. #新建PCA降维的对象
  27. step5 = ('PCA', PCA(n_components=2))
  28. #新建逻辑回归的对象,其为待训练的模型作为流水线的最后一步
  29. step6 = ('LogisticRegression', LogisticRegression(penalty='l2'))
  30. #新建流水线处理对象
  31. #参数steps为需要流水线处理的对象列表,该列表为二元组列表,第一元为对象的名称,第二元为对象
  32. pipeline = Pipeline(steps=[step1, step2, step3, step4, step5, step6])

自动化调参

一、自动化调参

通过GridSearchCV函数接口,对比不同结果,找到最棒的参数设置【可能会出现Runtime Error】

  1. from sklearn.grid_search import GridSearchCV
  2.  
  3. #新建网格搜索对象
  4. #第一参数为待训练的模型
  5. #param_grid为待调参数组成的网格,字典格式,键为参数名称(格式“对象名称__子对象名称__参数名称”),值为可取的参数值列表
  6. grid_search = GridSearchCV(pipeline, param_grid={'FeatureUnionExt__ToBinary__threshold':[1.0, 2.0, 3.0, 4.0], 'LogisticRegression__C':[0.1, 0.2, 0.4, 0.8]})
  7. #训练以及调参
  8. grid_search.fit(iris.data, iris.target)

Ref: sklearn :Pipeline 与 FeatureUnion入门指南【代码可运行】

  1. # Author: Andreas Mueller <amueller@ais.uni-bonn.de>
  2. #
  3. # License: BSD 3 clause
  4.  
  5. from sklearn.pipeline import Pipeline, FeatureUnion
  6. from sklearn.grid_search import GridSearchCV
  7. from sklearn.svm import SVC
  8. from sklearn.datasets import load_iris
  9. from sklearn.decomposition import PCA
  10. from sklearn.feature_selection import SelectKBest
  11.  
  12. iris = load_iris()
  13.  
  14. X, y = iris.data, iris.target
  15.  
  16. # This dataset is way to high-dimensional. Better do PCA:
  17. pca = PCA(n_components=2)
  18.  
  19. # Maybe some original features where good, too?
  20. selection = SelectKBest(k=1)
  21.  
  22. # Build estimator from PCA and Univariate selection:
  23.  
  24. combined_features = FeatureUnion([("pca", pca), ("univ_select", selection)])
  25.  
  26. # Use combined features to transform dataset:
  27. X_features = combined_features.fit(X, y).transform(X)
  28.  
  29. svm = SVC(kernel="linear")
  30.  
  31. # Do grid search over k, n_components and C:
  32. pipeline = Pipeline([("features", combined_features), ("svm", svm)])
  33. param_grid = dict(features__pca__n_components=[1, 2, 3],
  34. features__univ_select__k=[1, 2],
  35. svm__C=[0.1, 1, 10])
  36.  
  37. grid_search = GridSearchCV(pipeline, param_grid=param_grid, verbose=10)
  38. grid_search.fit(X, y)
  39. print(grid_search.best_estimator_)

运行时错误  RuntimeError

  1. $ python dm.py
  2. /usr/local/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_split.py:1978: FutureWarning: The default value of cv will change from 3 to 5 in version 0.22. Specify it explicitly to silence this warning.
  3. warnings.warn(CV_WARNING, FutureWarning)
  4. Traceback (most recent call last):
  5. File "dm.py", line 77, in <module>
  6. main()
  7. File "dm.py", line 70, in main
  8. datamining(iris, featureList)
  9. File "dm.py", line 36, in datamining
  10. grid_search.fit(iris.data, iris.target)
  11. File "/usr/local/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_search.py", line 632, in fit
  12. base_estimator = clone(self.estimator)
  13. File "/usr/local/anaconda3/lib/python3.7/site-packages/sklearn/base.py", line 64, in clone
  14. new_object_params[name] = clone(param, safe=False)
  15. File "/usr/local/anaconda3/lib/python3.7/site-packages/sklearn/base.py", line 52, in clone
  16. return estimator_type([clone(e, safe=safe) for e in estimator])
  17. File "/usr/local/anaconda3/lib/python3.7/site-packages/sklearn/base.py", line 52, in <listcomp>
  18. return estimator_type([clone(e, safe=safe) for e in estimator])
  19. File "/usr/local/anaconda3/lib/python3.7/site-packages/sklearn/base.py", line 52, in clone
  20. return estimator_type([clone(e, safe=safe) for e in estimator])
  21. File "/usr/local/anaconda3/lib/python3.7/site-packages/sklearn/base.py", line 52, in <listcomp>
  22. return estimator_type([clone(e, safe=safe) for e in estimator])
  23. File "/usr/local/anaconda3/lib/python3.7/site-packages/sklearn/base.py", line 75, in clone
  24. (estimator, name))
  25. RuntimeError: Cannot clone object FeatureUnionExt(idx_list=[[0], [1, 2, 3], [4]], n_jobs=1,
  26. transformer_list=[('OneHotEncoder',
  27. OneHotEncoder(categorical_features=None,
  28. categories=None, drop=None,
  29. dtype=<class 'numpy.float64'>,
  30. handle_unknown='error',
  31. n_values=None, sparse=False)),
  32. ('ToLog',
  33. FunctionTransformer(accept_sparse=False,
  34. check_inverse=True,
  35. func=<ufunc 'log1p'>,
  36. inv_kw_args=None,
  37. inverse_func=None,
  38. kw_args=None,
  39. pass_y='deprecated',
  40. validate=None)),
  41. ('ToBinary',
  42. Binarizer(copy=True, threshold=0.0))],
  43. transformer_weights=None), as the constructor either does not set or modifies parameter transformer_list

调参fit时报错

Error log来源;https://gplearn.readthedocs.io/en/stable/_modules/sklearn/base.html

模型保存

一、持久化

参考:[Python] 05 - Load data from Files

  1. #持久化数据
  2. # 第一个参数,为内存中的对象
  3. # 第二个参数,为保存在文件系统中的名称
  4. # 第三个参数,为压缩级别,0为不压缩,3为合适的压缩级别
  5. dump(grid_search, 'grid_search.dmp', compress=3)
  6. #从文件系统中加载数据到内存中
  7. grid_search = load('grid_search.dmp')

End.

End.

[Feature] Build pipeline的更多相关文章

  1. 聊聊2018.2的Scriptable Build Pipeline以及构建Assetbundle

    0x00 前言 在这篇文章中,我们选择了过去几周Unity官方社区交流群以及UUG社区群中比较有代表性的几个问题,总结在这里和大家进行分享.主要涵盖了Scriptable Build Pipeline ...

  2. 使用 Build Pipeline View 插件图表展示Jenkins job依赖关系

    使用 Build Pipeline View 查看Jenkins的Job的依赖关系图表 安装 Build Pipeline View 插件下载地址 下载后再jenkins的"插件管理&quo ...

  3. [Feature] Final pipeline: custom transformers

    有视频:https://www.youtube.com/watch?v=BFaadIqWlAg 有代码:https://github.com/jem1031/pandas-pipelines-cust ...

  4. jenkins2 pipeline插件的10个最佳实践

    jenkins pipeline的10个最佳实践. 文章来自:http://www.ciandcd.com文中的代码来自可以从github下载: https://github.com/ciandcd ...

  5. sklearn 中的 Pipeline 机制 和FeatureUnion

    一.pipeline的用法 pipeline可以用于把多个estimators级联成一个estimator,这么 做的原因是考虑了数据处理过程中一系列前后相继的固定流程,比如feature selec ...

  6. [转] Jenkins Pipeline插件十大最佳实践

    [From] http://blog.didispace.com/jenkins-pipeline-top-10-action/ Jenkins Pipeline 插件对于 Jenkins 用户来说可 ...

  7. 【转】jenkins插件pipeline使用介绍

    摘要: pipeline字面意思就是流水线,将很多步骤按顺序排列好,做完一个执行下一个.下面简单介绍下如何使用该插件帮我们完成一些流水线型的任务 pipeline字面意思就是流水线,将很多步骤按顺序排 ...

  8. sklearn中pipeline的用法和FeatureUnion

    一.pipeline的用法 pipeline可以用于把多个estimators级联成一个estimator,这么 做的原因是考虑了数据处理过程中一系列前后相继的固定流程,比如feature selec ...

  9. 9.Jenkins进阶之流水线pipeline基础使用实践(2)

    目录一览: 0x01 基础实践 0x02 进阶实践 (1) Sonarqube 代码质量检测之 Pipeline Script from SCM (2) Gitlab 自动触发构建之 Pipeline ...

随机推荐

  1. C#DataGrid列值出现E形式的小数,将DataGrid表格上的数据保存至数据库表时会因格式转换不正确导致报错

    问题描述:在DataGridView中调整金额一列,当输入小数0.000001后会显示1E-6,此时进行保存操作时报错,提示无法将string类型转换成Decimal 原因分析:由于列调整金额为1E- ...

  2. Codeforces 1187 G - Gang Up

    G - Gang Up 思路: 每个点按时间拆点建边,然后跑最小费用流 一次走的人不能太多,假设每次走的人为k (k*k-(k-1)*(k-1))*d <= c+d k <= 24 代码: ...

  3. PEP8规范 Python

    前言 从很多地方搬运+总结,以后根据这个标准再将python的一些奇技淫巧结合起来,写出更pythonic的代码~ PEP8 编码规范 英文原版请点击这里 以下是@bobo的整理,原文请见PEP8 P ...

  4. string::back

    char& back(); const char& back() const; #include <iostream>#include <string> usi ...

  5. JSP常用标签

    JSP常用标签可以理解为JSTL user:普通用户 admin:站点管理员 JSTL1.1.2下载地址:http://archive.apache.org/dist/jakarta/taglibs/ ...

  6. FFmpeg常用命令学习笔记(四)处理原始数据命令

    处理原始数据命令  通过音视频设备采集的.没有经过任何加工的数据叫原始数据,而像我们平时播放的比如mp4文件是压缩后的数据.视频原始数据是YUV格式,音频原始数据是PCM格式.FFmpeg可以从封装格 ...

  7. redis四种部署方式

    1.单点 2.主从 3.哨兵 4.集群

  8. springboot 项目报错问题的解决

    报错如下: java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test ...

  9. [ZJOI2019]语言——树剖+树上差分+线段树合并

    原题链接戳这儿 SOLUTION 考虑一种非常\(naive\)的统计方法,就是对于每一个点\(u\),我们维护它能到达的点集\(S_u\),最后答案就是\(\frac{\sum\limits_{i= ...

  10. 【luoguP1955 】[NOI2015]程序自动分析--普通并查集

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变 ...