Sklearn.eline中的LeaveOneOutEncode
原学程将引见Sklearn.eline中的LeaveOneOutEncode的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。
成绩描写
我应用LeaveOneOutEncode创立了1个管讲。固然,我用了1个玩具的例子。Leave One Out用于转换类型变质
import pandas as pd
import numpy as np
from sklearn import preprocessing
import sklearn
from sklearn.pipeline import Pipeline
from sklearn.pipeline import FeatureUnion
from category_encoders import LeaveOneOutEncoder
from sklearn import linear_model
from sklearn.base import BaseEstimator, TransformerMixin
df= pd.DataFrame({ 'y': [一,二,三,四,五,六,七,8], 'a': ['a', 'b','a', 'b','a', 'b','a', 'b' ], 'b': [五,五,三,四,8,六,七,三],})
class ItemSelector(BaseEstimator, TransformerMixin):
def __init__(self, key):
self.key = key
def fit(self, x, y=None):
return self
def transform(self, data_dict):
return data_dict[self.key]
class MyLEncoder(BaseEstimator, TransformerMixin):
def transform(self, X, **fit_params):
enc = LeaveOneOutEncoder()
encc = enc.fit(np.asarray(X), y)
enc_data = encc.transform(np.asarray(X))
return enc_data
def fit_transform(self, X,y=None, **fit_params):
self.fit(X,y, **fit_params)
return self.transform(X)
def fit(self, X, y, **fit_params):
return self
X = df[['a', 'b']]
y = df['y']
regressor = linear_model.SGDRegressor()
pipeline = Pipeline([
# Use FeatureUnion to combine the features
('union', FeatureUnion(
transformer_list=[
# categorical
('categorical', Pipeline([
('selector', ItemSelector(key='a')),
('one_hot', MyLEncoder())
])),
# year
])),
# Use a regression
('model_fitting', linear_model.SGDRegressor()),
])
pipeline.fit(X, y)
pipeline.predict(X)
我在列车以及尝试数据上应用它时,这些皆是准确的!但是当我测验考试猜测新数据时,涌现毛病
pipeline.predict(pd.DataFrame({ 'y': [三, 8], 'a': ['a', 'b' ], 'b': [三, 六],}))
赞助查找毛病!这个毛病确定很简略,但是我的眼睛干透了。成绩必定出在MyLEncoder类中。我必需变动甚么?
推举谜底
您正在吸喊
encc = enc.fit(np.asarray(X), y)
在MyLEncoder
的transform()
办法中。
所以这里有多少个成绩:
一)您的LeaveOneOutEncoder
只忘住传播给MyLEncoder
的transform
的最初数据,而忘却了之前的数据。
二)试衣时LeaveOneOutEncoder
请求y
在场。但是当MyLEncoder
transform()
被挪用时,这在猜测时代没有会涌现。
三)以后您的线路:
pipeline.predict(X)
是靠命运运限任务的,由于您的X
是雷同的,当挪用MyLEncoder
transform()
时,您曾经界说了y
,所以应用它。但是这是毛病的。
四)没有相干的工作(能够没有会称其为毛病)。履行此操纵时:
pipeline.predict(pd.DataFrame({ 'y': [三, 8], 'a': ['a', 'b' ], 'b': [三, 六],}))
pipeline.predict()
只须要X
,没有须要y
。但是您也在个中收送了y
。今朝这没有是成绩,由于在管讲中,您只应用a
列并拾弃一切信息,但是能够在庞杂的树立中,这能够会遗漏,而且y
列中的数据将被用作功效(X
数据),这将给您毛病的成果。
若要处理此成绩,请将MyLEncoder
变动为:
class MyLEncoder(BaseEstimator, TransformerMixin):
# Save the enc during fitting
def fit(self, X, y, **fit_params):
enc = LeaveOneOutEncoder()
self.enc = enc.fit(np.asarray(X), y)
return self
# Here, no new learning should be done, so never call fit() inside this
# Only use the already saved enc here
def transform(self, X, **fit_params):
enc_data = self.enc.transform(np.asarray(X))
return enc_data
# No need to define this function, if you are not doing any optimisation in it.
# It will be automatically inherited from TransformerMixin
# I have only kept it here, because you kept it.
def fit_transform(self, X,y=None, **fit_params):
self.fit(X, y, **fit_params)
return self.transform(X)
如今履行此操纵时:
pipeline.predict(pd.DataFrame({ 'y': [三, 8], 'a': ['a', 'b' ], 'b': [三, 六],}))
您没有会支就任何毛病,但是仍如第四面所述,我愿望您如许做:
new_df = pd.DataFrame({ 'y': [三, 8], 'a': ['a', 'b' ], 'b': [三, 六],})
new_X = new_df[['a', 'b']]
new_y = new_df['y']
pipeline.predict(new_X)
使练习时光中应用的X以及猜测时光中应用的new_X瞅起去雷同。
佳了闭于Sklearn.eline中的LeaveOneOutEncode的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。