/** * 1. 为什么不做离散分割,因为使用one-hot encoding之后,按连续变量处理,可以获得不一定按照维度成员分割的效果, * 某一个维度可能个别成员作为单独的分割,其他则作为一个整体,这是直接写离散型分割比较难实现的。 * 2. 多分割本质上可以被二分替代,所以没必要去做更复杂的多分割,目前也没有依据二者表现会有显著的差别。这样我们就可以直接使用二叉树来做。 */ import { ClassifierBase } from "../base"; import { Params } from "../base/estimator"; import { SubsetSizeOption } from "../utils/paramResolvers"; export type IFeatureSplitType = 'continuous' | 'discrete'; export interface ISlice { X: number[][]; Y: number[]; } export interface IDTree { splitIndex: number; nodeValue: number; y: number; leftChild: IDTree | null; rightChild: IDTree | null; /** sample-weighted impurity decrease contributed by this split */ weightedImpurityDecrease?: number; /** Class probabilities at this node, ordered by the fitted tree classes. */ classProbabilities?: number[]; } export interface DecisionTreeProps { max_depth?: number; min_samples_split?: number; criterion?: 'entropy' | 'gini'; max_features?: SubsetSizeOption; randomState?: number; } export declare class DecisionTreeClassifier extends ClassifierBase { private dtree; private max_depth; private feature_number; private min_samples_split; private criterion; private max_features?; private randomState?; private random; constructor(props?: DecisionTreeProps); getParams(): Params; /** Impurity of a class-frequency vector, resolved from `criterion`. */ private impurity; private selectedFeatureIndices; /** * * @param sampleX * @param sampleY * @param attributes indices of attributes. */ treeGenerate(tree: IDTree, sampleX: number[][], sampleY: number[], depth: number): void; /** * Maximizes impurity gain over midpoint thresholds, scanning each feature * once in sorted order with incremental class counts. */ private attributeSelection; private nodeImpurity; fit(sampleX: number[][], sampleY: number[]): void; predict(sampleX: number[][]): number[]; get featureImportances(): number[]; getRawFeatureImportances(): number[]; private findSample; }