Rom*_*ler 9 python pandas scikit-learn
我想在pandas dataframe列的子集上使用sklearn.preprocessing.StandardScaler.在管道之外,这是微不足道的:
df[['A', 'B']] = scaler.fit_transform(df[['A', 'B']])
Run Code Online (Sandbox Code Playgroud)
但现在假设我在类型字符串的df中有列'C',以及下面的管道定义
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
pipeline = Pipeline([
('standard', StandardScaler())
])
df_scaled = pipeline.fit_transform(df)
Run Code Online (Sandbox Code Playgroud)
如何告诉StandardScaler只扩展A列和B列?
我已经习惯了SparkML管道,其中要缩放的特征可以传递给缩放器组件的构造函数:
normalizer = Normalizer(inputCol="features", outputCol="features_norm", p=1.0)
Run Code Online (Sandbox Code Playgroud)
注意:要素列包含稀疏向量,其中包含Spark的VectorAssembler创建的所有数字要素列
您可以查看sklearn-pandas,它提供了 Pandas DataFrame 和 sklearn 的集成,例如与 DataFrameMapper:
mapper = DataFrameMapper([
... (list_of_columnnames, StandardScaler())
... ])
Run Code Online (Sandbox Code Playgroud)
如果你不需要外部依赖,你可以使用一个简单的自己的转换器,正如我在这里回答的那样:
class Columns(BaseEstimator, TransformerMixin):
def __init__(self, names=None):
self.names = names
def fit(self, X, y=None, **fit_params):
return self
def transform(self, X):
return X[self.names]
pipe = make_pipeline(Columns(names=list_of_columnnames),StandardScaler())
Run Code Online (Sandbox Code Playgroud)
在直接 sklearn 中,您需要FunctionTransformer与 一起使用FeatureUnion。也就是说,您的管道将如下所示:
pipeline = Pipeline([
('scale_sum', feature_union(...))
])
Run Code Online (Sandbox Code Playgroud)
在功能联合中,一个函数将标准缩放器应用于某些列,另一个函数将不受影响地传递其他列。
使用Ibex(我与他人共同编写的正是为了让 sklearn 和 pandas 更好地工作),您可以将其编写如下:
from ibex.sklearn.preprocessing import StandardScaler
from ibex import trans
pipeline = (trans(StandardScaler(), in_cols=['A', 'B']) + trans(None, ['c', 'd'])) | <other pipeline steps>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1207 次 |
| 最近记录: |