func (p *Pipeline) PredicterClone() base.Predicter {
	clone := *p
	clone.NamedSteps = make([]NamedStep, len(p.NamedSteps))
	for i, step := range p.NamedSteps {
		if cloner, ok := step.Fiter.(base.Transformer); ok {
			clone.NamedSteps[i] = NamedStep{Name: step.Name, Fiter: cloner.TransformerClone()}
		} else if cloner, ok := step.Fiter.(base.Predicter); ok {
			clone.NamedSteps[i] = NamedStep{Name: step.Name, Fiter: cloner.PredicterClone()}
		} else {
			panic(fmt.Errorf("step %s is not clonable", step.Name))
		}
	}
	return &clone
}
PredicterClone for pipeline relies on children clone method is child is Transformer
package pipeline
import (
	"fmt"
	"strings"
	"github.com/pa-m/sklearn/base"
	"github.com/pa-m/sklearn/preprocessing"
	"gonum.org/v1/gonum/mat"
)
type NamedStep struct {
	Name string
	base.Fiter
}
type Pipeline struct {
	NamedSteps []NamedStep
	NOutputs int
}
func NewPipeline(steps ...NamedStep) *Pipeline {
	p := &Pipeline{NamedSteps: steps}
	return p
}