【问题标题】:Pandas: How to best select features that are not correlated?Pandas:如何最好地选择不相关的特征?
【发布时间】:2020-03-09 08:29:26
【问题描述】:

我正在尝试隔离数据集的哪些特征(即 Pandas DataFrame 的列)用于线性回归,并且我想选择那些不强相关的特征(假设自变量需要彼此不相关,因此我们要删除任何看似强相关的)。

我已经隔离了与我的目标变量相关的初始特征列表,如下所示:

# get the absolute correlations for the target variable
correlations_target = abs(df.corr()[target_variable_name])

# filter out those that are below our threshold
correlated_features = correlations_target[correlations_target >= correlation_threshold]

# drop the target variable's column
correlated_features.drop(target_variable_name, inplace=True)

# get the column names for later use
correlated_feature_variable_names = correlated_features.index

我现在想检查这些相关的特征变量中的每一个,并确保它们中没有一个具有很强的相关性,如果确实存在,则将与目标变量相关性最弱的那个丢弃。这是我为此准备的:

# the collection of feature variable names we'll drop due to their being correlated to other features
correlated_feature_variable_names_to_drop = []

# loop over the feature combinations
for name_1 in correlated_feature_variable_names:
    for name_2 in correlated_feature_variable_names:
        # only look at correlations between separate feature variables
        if name_1 != name_2:
            # drop one of the feature variables if there's a strong correlation
            if abs(df[[name_1, name_2]].corr()[name_1][name_2]) > 0.6:
                # only worry about it if neither of the variables have been added to the drop list
                if (name_1 not in correlated_feature_variable_names_to_drop) and \
                        (name_2 not in correlated_feature_variable_names_to_drop):
                    # drop the one which has the least correlation to the target variable
                    if correlated_features[name_1] >= correlated_features[name_2]:
                        correlated_feature_variable_names_to_drop.append(name_2)
                    else:
                        correlated_feature_variable_names_to_drop.append(name_1)

# drop the variables we've found that qualify
correlated_features.drop(correlated_feature_variable_names_to_drop, inplace=True)

# get the remaining variables' column names for later use
filtered_feature_variable_names = correlated_features.index

过滤后的特征集将用作简单回归模型的输入。例如:

# fit a simple ordinary least squares model to the features
X = df[filtered_feature_variable_names]
y = df[target_variable_name]
estimate = sm.OLS(y, np.asarray(X)).fit()

# display the regression results
estimate.summary()

因为这是我第一次尝试这个,所以我不确定这是否是正确的方法,如果是,那么可能有一种更聪明或更有效(或“Pythonic”)的方法比我上面使用的循环方法执行过滤。

【问题讨论】:

    标签: python pandas linear-regression


    【解决方案1】:

    让我先说我可能在这里遗漏了您的部分意图,因为您所写的内容虽然编码清晰,但却是通用的。我在确定这是术语还是其他东西时遇到了问题。

    我认为您的意图是寻找并过滤掉彼此高度相关但本身用于解释第三件事的事物。例如,年龄和天数实际上是在描述同一件事(时间)。任何一个,但不是两者都可以描述与树直径等第三个事物的某种关系。这里的概念是共线性,你想减少它是绝对正确的。

    这就是探索性数据分析的用武之地。像correlation matrix heatmap 这样的某种快速可视化将是很好的第一步。

    但是,当您进行回归时,您正在寻找实际上相关但彼此不共线的事物。我了解您打算将其输入到一个简单的回归模型中,但在这种情况下您可以考虑使用 sklearn 的 lassoridge 回归工具。

    使用 sklearn 的另一个原因:您的示例可能与我给出的示例不同(年份与天数相关),后者恰好是完全相关的。在您的情况下,摆脱一个或另一个可能会摆脱一些预测信息。两种模型都会对数据进行规范化,都具有自动特征选择的优势。 Ridge 处理具有多重共线性的数据。另一方面,如果你有稀疏的数据,套索更好。

    最后一点:虽然 SO 绝对是更大的社区,但我认为您的问题可能会在 Stack Exchange 的数据科学社区得到更好的答案。

    【讨论】:

    • 谢谢@hrokr,非常有帮助。
    猜你喜欢
    • 2015-08-23
    • 2017-08-14
    • 2019-08-13
    • 2020-09-25
    • 2021-07-26
    • 2013-03-29
    • 2014-09-21
    • 2021-04-06
    • 1970-01-01
    相关资源
    最近更新 更多