Scikit-learn是一个强大的机器学习库,它提供了许多内部实用工具来帮助开发者更高效地进行数据处理和模型训练。这些工具被封装在sklearn.utils
模块中,虽然它们主要是为了库内部使用,但了解这些工具可以帮助更好地理解Scikit-learn的工作原理。需要注意的是,这些工具的API可能会随着Scikit-learn版本的更新而变化,因此在使用时需要留意版本兼容性。
在编写函数时,如果函数接受数组、矩阵或稀疏矩阵作为参数,可以使用以下工具进行输入验证:
assert_all_finite
:如果数组包含NaN或Inf,则抛出错误。as_float_array
:将输入转换为浮点数数组。如果传递了稀疏矩阵,则返回稀疏矩阵。check_array
:检查输入是否为2D数组,对稀疏矩阵抛出错误。可以指定允许的稀疏矩阵格式,以及是否允许1D或N维数组。默认情况下会调用assert_all_finite
。check_X_y
:检查X和y的长度是否一致,对X调用check_array
,对y调用column_or_1d
。对于多标签分类或多目标回归,可以指定multi_output=True
,在这种情况下会对y调用check_array
。indexable
:检查所有输入数组的长度是否一致,并且可以使用safe_index
进行切片或索引。这用于验证交叉验证的输入。validation.check_memory
:检查输入是否类似于joblib.Memory
,这意味着它可以被转换为sklearn.utils.Memory
实例(通常是表示缓存目录的字符串)或具有相同的接口。在代码中依赖随机数生成器时,应避免直接使用numpy.random.random
或numpy.random.normal
等函数,因为这可能导致单元测试中的可重复性问题。相反,应使用numpy.random.RandomState
对象,该对象基于传递给类或函数的random_state
参数构建。可以使用下面的check_random_state
函数创建随机数生成器对象:
from sklearn.utils import check_random_state
random_state = 0
random_state = check_random_state(random_state)
random_state.rand(4)
这将输出一个随机数组。
Scikit-learn提供了一些工具来高效地执行线性代数和数组操作。例如:
extmath.randomized_range_finder
:构建一个正交矩阵,其范围近似于输入矩阵的范围。这在extmath.randomized_svd
中使用。extmath.randomized_svd
:计算k-截断的随机SVD。这个算法使用随机化来加速计算,特别适合在大型矩阵上提取少量组件。arrayfuncs.cholesky_delete
:从Cholesky分解中删除一个项。arrayfuncs.min_pos
:在数组中找到正数值的最小值。extmath.fast_logdet
:高效计算矩阵的行列式对数。extmath.density
:高效计算稀疏向量的密度。extmath.safe_sparse_dot
:点积,可以正确处理scipy.sparse
输入。如果输入是密集的,则等同于numpy.dot
。extmath.weighted_mode
:scipy.stats.mode
的扩展,允许每个项具有实数值权重。resample
:以一致的方式重新采样数组或稀疏矩阵。shuffle
:以一致的方式重新排列数组或稀疏矩阵。在k_means
中使用。random.sample_without_replacement
实现了高效的算法,用于在不替换的情况下从大小为n_population
的总体中抽取n_samples
个整数。
sklearn.utils.sparsefuncs
Cython模块托管了编译扩展,用于高效处理scipy.sparse
数据。例如:
sparsefuncs.mean_variance_axis
:计算CSR矩阵沿指定轴的均值和方差。用于在KMeans
中归一化容忍度停止标准。sparsefuncs_fast.inplace_csr_row_normalize_l1
和sparsefuncs_fast.inplace_csr_row_normalize_l2
:可用于将单个稀疏样本归一化为单位L1或L2范数,如在Normalizer
中所做的。sparsefuncs.inplace_csr_column_scale
:可用于将CSR矩阵的列乘以一个常数比例(每列一个比例)。用于在StandardScaler
中将特征缩放到单位标准差。sort_graph_by_row_values
:可用于对CSR稀疏矩阵进行排序,使得每一行都以递增的值存储。这在使用最近邻图的估计器中使用预计算的稀疏距离矩阵时很有用。graph.single_source_shortest_path_length
:返回从单个源到图中所有连接节点的最短路径。代码改编自networkx
。如果再次需要,使用graph_shortest_path
中的单次Dijkstra算法迭代会快得多。
Scikit-learn还提供了一些测试函数,用于检查一致的行为和接口:
discovery.all_estimators
:返回Scikit-learn中所有估计器的列表。discovery.all_displays
:返回Scikit-learn中所有显示(与绘图API相关)的列表。discovery.all_functions
:返回Scikit-learn中所有函数的列表。Scikit-learn还提供了一些用于多类和多标签分类的实用函数,例如:
multiclass.is_multilabel
:辅助函数,用于检查任务是否为多标签分类。multiclass.unique_labels
:辅助函数,用于从不同格式的目标中提取有序的唯一标签数组。Scikit-learn还提供了一些辅助函数,例如:
gen_even_slices
:生成器,用于创建n包的切片,直到n。在dict_learning
和k_means
中使用。gen_batches
:生成器,用于从0到n创建包含批量大小元素的切片。safe_mask
:辅助函数,用于将掩码转换为numpy数组或scipy稀疏矩阵预期的格式(稀疏矩阵仅支持整数索引,而numpy数组支持布尔掩码和整数索引)。safe_sqr
:辅助函数,用于统一平方(**2)数组、矩阵和稀疏矩阵。murmurhash3_32
提供了一个Python包装器,用于MurmurHash3_x86_32 C++非加密哈希函数。这个哈希函数适用于实现查找表、布隆过滤器、计数最小草图、特征哈希和隐式定义的稀疏随机投影。例如:
from sklearn.utils import murmurhash3_32
murmurhash3_32("some feature", seed=0) == -384616559
murmurhash3_32("some feature", seed=0, positive=True) == 3910350737
此外,sklearn.utils.murmurhash
模块也可以从其他Cython模块中“cimport”,以便在跳过Python解释器开销的同时,从MurmurHash的高性能中受益。
Scikit-learn还提供了一些警告和异常处理工具,例如:
deprecated
:装饰器,用于标记函数或类为已弃用。ConvergenceWarning
:自定义警告,用于捕获收敛问题。在sklearn.covariance.graphical_lasso
中使用。