ΠΠ°ΠΌ Π΄Π°Π½Π° ΠΌΠ°ΡΡΠΈΡΠ° X
β ΡΠΏΠΈΡΠΎΠΊ ΡΠΏΠΈΡΠΊΠΎΠ² Ρ ΡΠΈΡΠ»ΠΎΠ²ΡΠΌΠΈ ΠΏΡΠΈΠ·Π½Π°ΠΊΠ°ΠΌΠΈ. ΠΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΎΠ² Π±ΡΠ»ΠΈ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Ρ, ΠΈ Π½Π΅ Π½Π΅ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (ΡΠΎ Π΅ΡΡΡ, ΠΎΠ½ΠΈ Π½Π΅ ΠΊΠΎΡΡΠ΅Π»ΠΈΡΡΡΡ Π½ΠΈ Ρ ΠΎΠ΄Π½ΠΈΠΌ Π΄ΡΡΠ³ΠΈΠΌ).
ΠΡΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ drop_random_features(X, threshold=0.05)
, ΠΊΠΎΡΠΎΡΠ°Ρ Π²Π΅ΡΠ½ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΎΠ², ΡΠ»Π°Π±ΠΎ ΠΊΠΎΡΡΠ΅Π»ΠΈΡΡΡΡΠΈΡ
ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ (ΠΏΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΊΠΎΡΡΠ΅Π»ΡΡΠΈΠΈ ΠΠΈΡΡΠΎΠ½Π°).
ΠΡΠ»ΠΈ ΠΏΡΠΈΠ·Π½Π°ΠΊ Π½Π΅ ΠΊΠΎΡΡΠ΅Π»ΠΈΡΡΠ΅Ρ Π½ΠΈ Ρ ΠΎΠ΄Π½ΠΈΠΌ Π΄ΡΡΠ³ΠΈΠΌ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ Π½Π° threshold
, ΠΎΠ½ ΡΡΠΈΡΠ°Π΅ΡΡΡ ΠΏΡΠ΅Π²Π΄ΠΎΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ ΠΈ ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ.
Π¦Π΅Π»Ρ:
ΠΠ°ΠΉΡΠΈ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΈΠΌΠ΅ΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ²ΡΠ·ΠΈ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΈ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΡΠ²Π»ΡΡΡΡΡ ΡΡΠΌΠΎΠΌ. ΠΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π½ΡΠΆΠ½ΠΎ ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ
import numpy as np
def drop_random_features(X, threshold=0.05):
X = np.array(X)
n_features = X.shape[1]
to_drop = []
for i in range(n_features):
max_corr = 0
for j in range(n_features):
if i != j:
corr = abs(np.corrcoef(X[:, i], X[:, j])[0, 1])
max_corr = max(max_corr, corr)
if max_corr < threshold:
to_drop.append(i)
return to_drop
# ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
np.random.seed(42)
X = np.column_stack([
np.linspace(1, 10, 100), # Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠΉ
np.linspace(10, 1, 100), # ΠΎΠ±ΡΠ°ΡΠ½ΡΠΉ
np.random.rand(100), # ΡΡΠΌ
np.linspace(5, 50, 100) + np.random.rand(100) * 0.1 # ΠΏΠΎΡΡΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠΉ
])
print(drop_random_features(X, threshold=0.2))
# ΠΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ: [2] β ΡΡΠ΅ΡΠΈΠΉ ΠΏΡΠΈΠ·Π½Π°ΠΊ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ