coefficient - Cómo calcular la correlación entre todas las columnas y eliminar las altamente correlacionadas usando python o pandas
corr python numpy (4)
En primer lugar, sugeriría usar algo como PCA como método de reducción de dimensionalidad , pero si tiene que tirar el suyo, entonces su pregunta no está suficientemente restringida. Donde dos columnas están correlacionadas, ¿cuál quieres eliminar? ¿Qué sucede si la columna A está correlacionada con la columna B, mientras que la columna B está correlacionada con la columna C, pero no la columna A?
Puede obtener una matriz de correlaciones por DataFrame.corr()
llamando a DataFrame.corr()
( docs ) que podría ayudarlo a desarrollar su algoritmo, pero eventualmente deberá convertirlo en una lista de columnas para mantener.
Tengo un enorme conjunto de datos y antes del modelado de aprendizaje automático siempre se sugiere que primero se eliminen los descriptores altamente correlacionados (columnas) cómo puedo calcular la correlación de bits de columna y eliminar la columna con un valor de umbral, por ejemplo, eliminar todas las columnas o descriptores teniendo una correlación> 0.8. también debería conservar los encabezados para reducir los datos.
Ejemplo de conjunto de datos
GA PN PC MBP GR AP
0.033 6.652 6.681 0.194 0.874 3.177
0.034 9.039 6.224 0.194 1.137 3.4
0.035 10.936 10.304 1.015 0.911 4.9
0.022 10.11 9.603 1.374 0.848 4.566
0.035 2.963 17.156 0.599 0.823 9.406
0.033 10.872 10.244 1.015 0.574 4.871
0.035 21.694 22.389 1.015 0.859 9.259
0.035 10.936 10.304 1.015 0.911 4.5
Por favor ayuda....
Conecte su dataframe de características en esta función y simplemente configure su umbral de correlación. Caerá columnas automáticamente, pero también le dará un diagnóstico de las columnas que descarta si desea hacerlo manualmente.
def corr_df(x, corr_val):
''''''
Obj: Drops features that are strongly correlated to other features.
This lowers model complexity, and aids in generalizing the model.
Inputs:
df: features df (x)
corr_val: Columns are dropped relative to the corr_val input (e.g. 0.8)
Output: df that only includes uncorrelated features
''''''
# Creates Correlation Matrix and Instantiates
corr_matrix = x.corr()
iters = range(len(corr_matrix.columns) - 1)
drop_cols = []
# Iterates through Correlation Matrix Table to find correlated columns
for i in iters:
for j in range(i):
item = corr_matrix.iloc[j:(j+1), (i+1):(i+2)]
col = item.columns
row = item.index
val = item.values
if val >= corr_val:
# Prints the correlated feature set and the corr val
print(col.values[0], "|", row.values[0], "|", round(val[0][0], 2))
drop_cols.append(i)
drops = sorted(set(drop_cols))[::-1]
# Drops the correlated columns
for i in drops:
col = x.iloc[:, (i+1):(i+2)].columns.values
df = x.drop(col, axis=1)
return df
Aquí está el enfoque que he usado:
def correlation(dataset, threshold):
col_corr = set() # Set of all the names of deleted columns
corr_matrix = dataset.corr()
for i in range(len(corr_matrix.columns)):
for j in range(i):
if corr_matrix.iloc[i, j] >= threshold:
colname = corr_matrix.columns[i] # getting the name of column
col_corr.add(colname)
if colname in dataset.columns:
del dataset[colname] # deleting the column from the dataset
print(dataset)
¡Espero que esto ayude!
Puede usar lo siguiente para un marco de datos dado df:
corr_matrix = df.corr().abs()
high_corr_var=np.where(corr_matrix>0.8)
high_corr_var=[(corr_matrix.columns[x],corr_matrix.columns[y]) for x,y in zip(*corr_matrix) if x!=y and x<y]