在 Scikit 特征选择后保留特征名称
Retain feature names after Scikit Feature Selection
在 运行 来自 Scikit-Learn 的一组数据的方差阈值之后,它删除了几个特征。我觉得我在做一些简单而愚蠢的事情,但我想保留其余功能的名称。以下代码:
def VarianceThreshold_selector(data):
selector = VarianceThreshold(.5)
selector.fit(data)
selector = (pd.DataFrame(selector.transform(data)))
return selector
x = VarianceThreshold_selector(data)
print(x)
更改以下数据(这只是行的一小部分):
Survived Pclass Sex Age SibSp Parch Nonsense
0 3 1 22 1 0 0
1 1 2 38 1 0 0
1 3 2 26 0 0 0
进入这个(同样只是行的一小部分)
0 1 2 3
0 3 22.0 1 0
1 1 38.0 1 0
2 3 26.0 0 0
使用 get_support 方法,我知道它们是 Pclass、Age、Sibsp 和 Parch,所以我更希望这个 return 更像:
Pclass Age Sibsp Parch
0 3 22.0 1 0
1 1 38.0 1 0
2 3 26.0 0 0
有没有简单的方法来做到这一点?我是 Scikit Learn 的新手,所以我可能只是在做一些愚蠢的事情。
可能有更好的方法来做到这一点,但对于那些感兴趣的人,我是这样做的:
def VarianceThreshold_selector(data):
#Select Model
selector = VarianceThreshold(0) #Defaults to 0.0, e.g. only remove features with the same value in all samples
#Fit the Model
selector.fit(data)
features = selector.get_support(indices = True) #returns an array of integers corresponding to nonremoved features
features = [column for column in data[features]] #Array of all nonremoved features' names
#Format and Return
selector = pd.DataFrame(selector.transform(data))
selector.columns = features
return selector
这样的事情会有帮助吗?如果您将 pandas 数据框传递给它,它将获取列并使用 get_support
就像您提到的那样通过索引遍历列列表以仅提取满足的列 headers方差阈值。
>>> df
Survived Pclass Sex Age SibSp Parch Nonsense
0 0 3 1 22 1 0 0
1 1 1 2 38 1 0 0
2 1 3 2 26 0 0 0
>>> from sklearn.feature_selection import VarianceThreshold
>>> def variance_threshold_selector(data, threshold=0.5):
selector = VarianceThreshold(threshold)
selector.fit(data)
return data[data.columns[selector.get_support(indices=True)]]
>>> variance_threshold_selector(df, 0.5)
Pclass Age
0 3 22
1 1 38
2 3 26
>>> variance_threshold_selector(df, 0.9)
Age
0 22
1 38
2 26
>>> variance_threshold_selector(df, 0.1)
Survived Pclass Sex Age SibSp
0 0 3 1 22 1
1 1 1 2 38 1
2 1 3 2 26 0
我来这里是为了寻找一种方法来获取 transform()
或 fit_transform()
到 return 数据框,但我怀疑它不受支持。
但是,您可以像这样更干净地对数据进行子集化:
data_transformed = data.loc[:, selector.get_support()]
由于我在使用 Jarad 的功能时遇到了一些问题,所以我将其与 pteehan 的解决方案混合使用,我发现后者更可靠。我还添加了 NA 替换作为标准,因为 VarianceThreshold 不喜欢 NA 值。
def variance_threshold_select(df, thresh=0.0, na_replacement=-999):
df1 = df.copy(deep=True) # Make a deep copy of the dataframe
selector = VarianceThreshold(thresh)
selector.fit(df1.fillna(na_replacement)) # Fill NA values as VarianceThreshold cannot deal with those
df2 = df.loc[:,selector.get_support(indices=False)] # Get new dataframe with columns deleted that have NA values
return df2
您也可以使用 Pandas 进行阈值处理
data_new = data.loc[:, data.std(axis=0) > 0.75]
这个作为代码怎么样?
columns = [col for col in df.columns]
low_var_cols = []
for col in train_file.columns:
if statistics.variance(df[col]) <= 0.1:
low_var_cols.append(col)
然后从数据框中删除列?
在 运行 来自 Scikit-Learn 的一组数据的方差阈值之后,它删除了几个特征。我觉得我在做一些简单而愚蠢的事情,但我想保留其余功能的名称。以下代码:
def VarianceThreshold_selector(data):
selector = VarianceThreshold(.5)
selector.fit(data)
selector = (pd.DataFrame(selector.transform(data)))
return selector
x = VarianceThreshold_selector(data)
print(x)
更改以下数据(这只是行的一小部分):
Survived Pclass Sex Age SibSp Parch Nonsense
0 3 1 22 1 0 0
1 1 2 38 1 0 0
1 3 2 26 0 0 0
进入这个(同样只是行的一小部分)
0 1 2 3
0 3 22.0 1 0
1 1 38.0 1 0
2 3 26.0 0 0
使用 get_support 方法,我知道它们是 Pclass、Age、Sibsp 和 Parch,所以我更希望这个 return 更像:
Pclass Age Sibsp Parch
0 3 22.0 1 0
1 1 38.0 1 0
2 3 26.0 0 0
有没有简单的方法来做到这一点?我是 Scikit Learn 的新手,所以我可能只是在做一些愚蠢的事情。
可能有更好的方法来做到这一点,但对于那些感兴趣的人,我是这样做的:
def VarianceThreshold_selector(data):
#Select Model
selector = VarianceThreshold(0) #Defaults to 0.0, e.g. only remove features with the same value in all samples
#Fit the Model
selector.fit(data)
features = selector.get_support(indices = True) #returns an array of integers corresponding to nonremoved features
features = [column for column in data[features]] #Array of all nonremoved features' names
#Format and Return
selector = pd.DataFrame(selector.transform(data))
selector.columns = features
return selector
这样的事情会有帮助吗?如果您将 pandas 数据框传递给它,它将获取列并使用 get_support
就像您提到的那样通过索引遍历列列表以仅提取满足的列 headers方差阈值。
>>> df
Survived Pclass Sex Age SibSp Parch Nonsense
0 0 3 1 22 1 0 0
1 1 1 2 38 1 0 0
2 1 3 2 26 0 0 0
>>> from sklearn.feature_selection import VarianceThreshold
>>> def variance_threshold_selector(data, threshold=0.5):
selector = VarianceThreshold(threshold)
selector.fit(data)
return data[data.columns[selector.get_support(indices=True)]]
>>> variance_threshold_selector(df, 0.5)
Pclass Age
0 3 22
1 1 38
2 3 26
>>> variance_threshold_selector(df, 0.9)
Age
0 22
1 38
2 26
>>> variance_threshold_selector(df, 0.1)
Survived Pclass Sex Age SibSp
0 0 3 1 22 1
1 1 1 2 38 1
2 1 3 2 26 0
我来这里是为了寻找一种方法来获取 transform()
或 fit_transform()
到 return 数据框,但我怀疑它不受支持。
但是,您可以像这样更干净地对数据进行子集化:
data_transformed = data.loc[:, selector.get_support()]
由于我在使用 Jarad 的功能时遇到了一些问题,所以我将其与 pteehan 的解决方案混合使用,我发现后者更可靠。我还添加了 NA 替换作为标准,因为 VarianceThreshold 不喜欢 NA 值。
def variance_threshold_select(df, thresh=0.0, na_replacement=-999):
df1 = df.copy(deep=True) # Make a deep copy of the dataframe
selector = VarianceThreshold(thresh)
selector.fit(df1.fillna(na_replacement)) # Fill NA values as VarianceThreshold cannot deal with those
df2 = df.loc[:,selector.get_support(indices=False)] # Get new dataframe with columns deleted that have NA values
return df2
您也可以使用 Pandas 进行阈值处理
data_new = data.loc[:, data.std(axis=0) > 0.75]
这个作为代码怎么样?
columns = [col for col in df.columns]
low_var_cols = []
for col in train_file.columns:
if statistics.variance(df[col]) <= 0.1:
low_var_cols.append(col)
然后从数据框中删除列?