问题描述
我正在使用此数据集:
https://www.kaggle.com/shahir/protein-data-set
摘要
我正在努力创建带有内置转换器和自定义转换器的预处理管道,其中将包括一个向数据添加其他属性并进一步对添加的属性执行转换的管道。
其他属性示例:
- 有一个phValue属性缺少数据。我想尝试创建一个附加属性,该属性会将phValue标记为phLabel列中的(酸,中性,碱性)。
- 每个序列特征的字符串长度。
这将需要估算phValue的缺失值,然后创建其他属性和其他转换器,这些转换器也将转换sequence_length属性。
我的变形金刚。
这是我如何创建自定义转换器的示例,可以将其用于手动预处理,但是,这不是创建完整的预处理管道时正确的方法。
def data_to_frame(X):
if isinstance(X,pd.DataFrame):
return X
elif isinstance(X,sparse.csr_matrix):
return pd.DataFrame(X,indices,atributes)
elif isinstance(X,np.ndarray):
return pd.DataFrame(X,atributes)
else:
raise Exception("Incorrect Data Structure Passed")
class CombinedAttributesAdder(BaseEstimator,TransformerMixin):
def __init__(self,no_difference = True): # no *args or **kargs
self.no_difference = no_difference
def fit(self,X,y=None):
return self # nothing else to do
def transform(self,X):
atributes.extend(['sequence_length','difference','phLabel'])
sequence_length = X.sequence.str.len()
difference = X['residueCount'] - sequence_length
phLabel = X['phValue'].apply(ph_labels)
if self.no_difference:
atributes.append('no_difference')
no_difference = (difference == 0)
return np.c_[X,sequence_length,difference,phLabel,no_difference]
else:
return np.c_[X,phLabel]
变形金刚中的熊猫行动。
我要在变形金刚中执行的操作特定于熊猫。我的解决方案是将输入的numpy数组转换为数据帧,并在转换函数中将其作为numpy数组返回。我将全局变量用于属性和索引。我意识到这是一种乏味的方法。 如何在自定义转换器中使用熊猫操作?
我遇到了这篇博客文章,但是我无法使用Column Transformer做到这一点: https://zablo.net/blog/post/pandas-dataframe-in-scikit-learn-feature-union/
更新:
我的管道存在其他问题。 指定要转换的列时,后续转换器如何工作? 它会将整套传递给每个变压器,在指定的列上进行操作,然后将修改后的全套返回给其他变压器吗? 另外,当我将参数传递给构造函数时,即使没有为自定义转换器指定列似乎也会引发错误,即使在我的情况下它们不起作用。我应该如何更改我的代码?
如果在fit_transform之后我注释掉OrdinalEncoder和OneHotEncoder,则ColumnTransformer将输出一个形状为(rows,72)的numpy数组。 在FeatureSelector转换器中有19个属性,我删除了2个属性。因此,我希望在没有OHE的情况下收到一系列(第17行)。
如果我将其保留原样,则会收到:ValueError: Input contains NaN.
attributes
是数据集中每个列的全局数组。我删除了掉在FeatureSelector中的值。
# numeric_feat_eng + categ_feat_eng contains all of my attributes
prepoc_pipeline = make_column_transformer(
(SimpleImputer(strategy='mean'),numeric_feat_eng),(SimpleImputer(strategy='most_frequent'),categ_feat_eng),(FixAtributeValues(),attributes),(CombinedAttributesAdder(),(FeatureSelector(attributes_to_drop),attributes_to_drop),(LogTransformation(atr_log_trans),atr_log_trans),(StandardScaler(),(OrdinalEncoder(),id_cols),(OneHotEncoder(handle_unknown='ignore'),categ_without_ids)
)
class FeatureSelector(BaseEstimator,attributes_drop = ['pdbxDetails','sequence']):
self.attributes_drop = attributes_drop
def fit(self,X):
X = data_to_frame(X)
for x in self.attributes_drop:
attributes.remove(x)
X = X.drop(columns=self.attributes_drop)
return X
如果有人可以指导我如何做到这一点,将不胜感激!或向我提供可以学习如何创建管道的资源。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)