При изменении порядка столбцов ввода для sklearn DecisionTreeClassifier
точность, похоже, меняется. Так быть не должно. Что я делаю не так?
from sklearn.datasets import load_iris
import numpy as np
iris = load_iris()
X = iris['data']
y = iris['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.90, random_state=0)
clf = DecisionTreeClassifier(random_state=0)
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))
clf = DecisionTreeClassifier(random_state=0)
clf.fit(np.hstack((X_train[:,1:], X_train[:,:1])), y_train)
print(clf.score(X_test, y_test))
clf = DecisionTreeClassifier(random_state=0)
clf.fit(np.hstack((X_train[:,2:], X_train[:,:2])), y_train)
print(clf.score(X_test, y_test))
clf = DecisionTreeClassifier(random_state=0)
clf.fit(np.hstack((X_train[:,3:], X_train[:,:3])), y_train)
print(clf.score(X_test, y_test))
Выполнение этого кода приводит к следующему выводу:
0.9407407407407408
0.22962962962962963
0.34074074074074073
0.3333333333333333
Это задавалось 3 года go, но опрошенный был отклонен, потому что нет код был предоставлен. Влияет ли порядок функций на алгоритм дерева решений в sklearn?
Edit
В приведенном выше коде я забыл применить изменение порядка столбцов к тестовые данные.
Я обнаружил, что разные результаты сохраняются и при применении переупорядочения ко всему набору данных.
Сначала я импортирую данные и превращаю их в pandas фрейм данных.
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
import numpy as np
iris = load_iris()
y = iris['target']
iris_features = iris['feature_names']
iris = pd.DataFrame(iris['data'], columns=iris['feature_names'])
Затем я выбираю все данные, используя исходные упорядоченные имена функций. Я тренирую и оцениваю модель.
X = iris[iris_features].values
print(X.shape[1], iris_features)
# 4 ['petal length (cm)', 'petal width (cm)', 'sepal length (cm)', 'sepal width (cm)']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.95, random_state=0)
clf = DecisionTreeClassifier(random_state=0)
clf.fit(X_train, y_train)
pred = clf.predict(X_test)
print(np.mean(y_test == pred))
# 0.7062937062937062
Почему я все равно получаю разные результаты? Затем я выбираю другой порядок тех же столбцов для обучения и оценки модели.
X = iris[iris_features[2:]+iris_features[:2]].values
print(X.shape[1], iris_features[2:]+iris_features[:2])
# 4 ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.95, random_state=0)
clf = DecisionTreeClassifier(random_state=0)
clf.fit(X_train, y_train)
pred = clf.predict(X_test)
print(np.mean(y_test == pred))
# 0.8881118881118881