Problem ze standaryzacją do LinearSVC

0

Dzień dobry,
piszę tego posta w celu możliwych podpowiedzi na nurtującą mnie kwestię.
Jednym z zadań zbioru, które muszę wykonać jest zadanie, polegające na weryfikacji dokładności klasyfikacji na zbiorze testowym bazy Breast Cancer.

Początek był bardzo przyjemny, zmienne X oraz y przy pobieraniu bazy, podział na podzbiory (70/30 oraz random_state=2 jest narzucone), znalezienie C, dla którego dokładność klasyfikacji w zbiorze testowym jest największa i przychodzi moment Standaryzacji. I tu następuje moje zderzenie ze ścianą. ;)

X, y = load_breast_cancer(return_X_y=True)

temp = 0.0
maxVal = 0.0
maxValIndex = 0

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2)

accX = np.around(np.arange(0.01, 5.0, 1.0), decimals=2)
accY = []

for i in range(len(accX)):
    model = svm.SVC(kernel='linear', C=accX[i]).fit(X_train, y_train)
    acc = model.score(X_test, y_test) * 100
    accY.append(acc)
    if acc > temp:
        maxVal = acc
        maxValIndex = accX[i]
        temp = acc
    print(f'Dokładność klasyfikacji na zbiorze testowym {accX[i]} wynosi {acc:.3f}%')
print(f'maxVal {maxVal} najwieksze dla {maxValIndex}')

plt.figure()
plt.scatter(accX, accY, c='blue')
plt.title("Wykres funkcji [Zadanie 1]")
plt.xlabel('C = ?')
plt.ylabel('Dokładność ( % )')
plt.show()

Druga część polecenia brzmi:

"Wykonać standaryzację danych treningowych, a wyuczone średnie i odchylenia standardowe zastosować do zbioru testowego. Ponownie wytrenować model LinearSVC , tym razem na przekształconych danych. Porównać dokładność klasyfikacji na zbiorze testowym."

"Wyznaczyć parametry StandardScaler na podstawie zbioru treningowego, a następnie przekształcić zbiór testowy na podstawie wyznaczonych parametrów na zbiorze treningowym. "

Domyślam się że średnie i odchylenie pobiorę sobie z StandardScaler(with_std=True, with_mean=True).fit(), ale kompletnie nie wiem co wrzucić w fit tutaj jak i przy modelu SVC oraz jakie zmienne dać do score.

Dziękuję za jakąkolwiek pomoc,
Jeśli należy coś dopowiedzieć to także proszę napisać. :3

0

Byłoby miło, jak byś podał bibliotekę z jakiej korzystasz, jeśli to scikit - learn, to dokumentacja jest czytelna:
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html

ale kompletnie nie wiem co wrzucić w fit tutaj jak i przy modelu SVC oraz jakie zmienne dać do score

Znormalizowane dane trenujesz tak samo.

0

hmm, dalej nie wiem gdzie co wrzucić :(

0

Trenujesz model na znormalizowanych danch tak samo jak wcześniej.

0

Mam coś takiego, ale wynik wszędzie otrzymuję ten sam, ~39%

sScaler = StandardScaler(with_std=True, with_mean=True)
X_train_sc = sScaler.fit_transform(X_train)

temp = 0.0
maxVal = 0.0
maxValIndex = 0
accX = np.around(np.arange(0.01, 10.0, 1.0), decimals=2)
accY = []

for i in range(len(accX)):
    model = svm.SVC(kernel='linear', C=accX[i]).fit(X_train_sc, y_train)
    acc = model.score(X_test, y_test) * 100
    accY.append(acc)
    if acc > temp:
        maxVal = acc
        maxValIndex = accX[i]
        temp = acc
    print(f'Dokładność klasyfikacji na zbiorze testowym {accX[i]} wynosi {acc:.3f}%')
print(f'maxVal {maxVal} najwieksze dla {maxValIndex}')

Edit:

Po zrobieniu jeszcze:

X_test_sc = sScaler.fit_transform(X_test)
acc = model.score(X_test_sc , y_test) * 100

Wynik ~99.4% ale czy to kończy zadanie?

0

Czy dane testowe zostały przekształcone tą samą średnią i wariancją?

0

Nie wiem gdzie to mogę umieścić, tym samym StandardScaler ale nie wiem czy to wystarczająco

0

Tak jak go używasz, to on Ci skaluje te dane na podstawie obliczonych parametrów; doczytaj w dokumentacji, jak z wyciągnąć dane i i jak mu zapodać.

0

Domyślam że przez get_params() i set_params() tak?

0

Wiem jak wyciągnąć mean, scale etc ale nie wiem jak tego użyć do test data

1 użytkowników online, w tym zalogowanych: 0, gości: 1