Metryki accuracy, precision, recall, F1-score

0

Jestem w trakcie pisania kodu odnośnie sieci neuronowych , program pracuje na 1200 zdjęciach na których są robione dane testowe , treningowe , walidacyjne itp. , poniżej jest link do mojego githuba , gdzie można sobie zobaczyć mój kod :
Działam na keras , tensorflow

https://github.com/dawid584/sign-language/blob/master/Untitled5.ipynb

Natomiast nie wiem jak zrobić jak w tytule podane metryki ?

W internecie jest napisane np. coś takiego -

tf.keras.metrics.Accuracy(name="accuracy", dtype=None) a potem
m = tf.keras.metrics.Accuracy() m.update_state([[1], [2], [3], [4]], [[0], [2], [3], [4]])
m.result().numpy() 0.75

Tylko , ja nie wiem co mam wprowadzić zamiast 1], [2], [3], [4, 0], [2], [3], [4 bo u mnie to są dane :

train_size = int(np.floor(0.8 * size)) a size to rozmiar zbioru załądownych plików zdjęć .
valid_size = int(np.floor(0.1 * size))
test_size = size - train_size - valid_size

Jak przygotować dane by móc je wprowadzić do metryki i zrobić podane metryki ? To mają być dane treningowe i testowe i potem X_pred i y_pred ? Bo z podanego modelu który jest na moim githubie to nie wiem jak to zrobić ?

1

Przewiduj etykiety za pomocą modelu na danych treningowych

train_predictions = model.predict(X_train)
train_predicted_labels = np.argmax(train_predictions, axis=1)

Porównaj przewidywane etykiety z prawdziwymi etykietami

train_accuracy = tf.keras.metrics.Accuracy()
train_accuracy.update_state(y_train, train_predicted_labels)
print("Train Accuracy:", train_accuracy.result().numpy())
0
uziom napisał(a):

Przewiduj etykiety za pomocą modelu na danych treningowych

train_predictions = model.predict(X_train)
train_predicted_labels = np.argmax(train_predictions, axis=1)

Porównaj przewidywane etykiety z prawdziwymi etykietami

train_accuracy = tf.keras.metrics.Accuracy()
train_accuracy.update_state(y_train, train_predicted_labels)
print("Train Accuracy:", train_accuracy.result().numpy())

Chodzi o to , że jak mam w sklearn X_train , y_train ,X_test ,y_test = train_test_split( X , y , .......) . To nie wiem co z mojego kodu wstawić jako X i jako y ? Bo u mnie jest zmienna size która równa się= ( originale_A (pobiera zdjęcia z jednego folderu) + original_B (pobiera zdjęcia z drugiego folderu , każde zdjęcie to np A1.jpg potem A2.jpg itp ).
Jak zrobię X = int ( size0,8) i y=(size0,2) to mi pokazuje błąd, jak zrobię to samo ale len (size*0,8) to mi też błąd pokazuje, że to jedno wymiarowa tablica z jedną liczbą,a ma być 2D. I trochę nie wiem jak to zrobić w tej sytuacji.

Jak przejdę ten problem i będę miał X_train , y_train , X_ test itp. to w zasadzie prlbelm będzie rozwiazany , ale nie wiem w tej sytuacji co zrobić by mieć tte zmienne.

0

np pisze coś takiego :
X , y = int(np.floor(0.8 * size)) , int(np.floor(0.2 * size))
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=4, stratify=y)

to mam błąd: TypeError: Singleton array array(40) cannot be considered a valid collection.

2

Jeśli masz listę plików ze zdjęciami, to musisz je wczytać jako tablicę NumPy i przetworzyć na odpowiedni format, który może być używany jako wejście do Twojego modelu. Możesz to zrobić za pomocą biblioteki OpenCV lub PIL.

Na przykład, jeśli chcesz wczytać obrazy z dwóch folderów i utworzyć tablicę NumPy dla danych treningowych.

import cv2
import numpy as np
import os

# ścieżki do folderów z danymi
folder_A = "ścieżka/do/folderu/A"
folder_B = "ścieżka/do/folderu/B"

# wczytanie obrazów z folderu A
data_A = []
for file in os.listdir(folder_A):
    img = cv2.imread(os.path.join(folder_A, file))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    data_A.append(img)

# wczytanie obrazów z folderu B
data_B = []
for file in os.listdir(folder_B):
    img = cv2.imread(os.path.join(folder_B, file))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    data_B.append(img)

# łączenie danych z dwóch folderów w jedną tablicę
X = np.array(data_A + data_B)

# utworzenie etykiet (0 dla folderu A, 1 dla folderu B)
y = np.array([0]*len(data_A) + [1]*len(data_B))

W tym przykładzie X to tablica NumPy z obrazami, a y to tablica NumPy z etykietami odpowiadającymi obrazom.

Następnie możesz użyć funkcji train_test_split z biblioteki scikit-learn, aby podzielić dane na zbiór treningowy i testowy

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

W tym przykładzie test_size=0.2 oznacza, że 20% danych zostanie użyte do testowania modelu, a 80% do treningu. random_state pozwala na powtórzenie wyników w przyszłości.

Teraz możesz przeprowadzić trenowanie modelu i obliczyć dokładność na danych treningowych i testowych, tak jak to zrobiłeś w swoim przykładzie

0

Ok przetestuje , chwila , oby teraz było wszytko ok.

1
dawid584 napisał(a):

np pisze coś takiego :
X , y = int(np.floor(0.8 * size)) , int(np.floor(0.2 * size))
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=4, stratify=y)

to mam błąd: TypeError: Singleton array array(40) cannot be considered a valid collection.

W Twoim przykładzie próbujesz podzielić wartości X i y na zbiór treningowy i testowy przed zastosowaniem funkcji train_test_split(), co powoduje błąd.

Funkcja train_test_split() przyjmuje jako argumenty dwie tablice NumPy (lub listy): jedną zawierającą dane (w Twoim przypadku X), a drugą zawierającą odpowiadające im etykiety (w Twoim przypadku y).

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=4, stratify=y)
0

Już mi działa to , dzięki

0

Zrobiłem:

X = np.array(data_A + data_B + data_C + data_0)
y = np.array([0]*len(data_A) + [1]*len(data_B) + [2]*len(data_C) + [3]*len(data_0))
potem:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=4, stratify=y)
I tu wszytsko działa kompiluje się , natomiast , poniżej :

Próbuje to teraz wstawić do modelu aby mieć predykcje i mając predykcje wstawić to do metryki , ale mam pewien problem :

from sklearn.linear_model import LogisticRegression
lr_model = LogisticRegression()
lr_model.fit(X_train, y_train) # trenowanie modelu
y_predict_train = lr_model.predict(X_train)
y_predict_test = lr_model.predict(X_test)

ValueError: Found array with dim 4. LogisticRegression expected <= 2.

Z drugiej strony jak próbuje to zrobić w ten sposób , czyli model_5 na którym robiłem dotychczasowe rzeczy to mam taki błąd :

train_predictions = model_5.predict(X_train)
train_predicted_labels = np.argmax(train_predictions, axis=1)

ValueError: Input 0 of layer "sequential_84" is incompatible with the layer: expected shape=(None, 150, 150, 3), found shape=(None, 240, 320, 3)

1

model LogisticRegression oczekuje, że wejściowe dane X_train będą miały maksymalnie 2 wymiary. W Twoim przypadku X_train ma 4 wymiary. Być może wartości w X zostały źle ukształtowane lub źle połączone. Spróbuj ponownie przetestować X i y, upewnij się, że są one w odpowiednim formacie.

Wymiary wejściowe nie odpowiadają wymiarom, które sieć neuronowa oczekuje. Wymiar wejściowy modelu jest zdefiniowany jako (None, 150, 150, 3), a Ty podajesz dane o wymiarze (None, 240, 320, 3). Upewnij się, że Twoje dane wejściowe mają wymiary zgodne z wymaganiami sieci neuronowej, którą próbujesz użyć.

0

Koda napisałem w sposób jak poniżej:

import numpy as np
import os

# ścieżki do folderów z danymi
folder_A = "C:\Kodilla\sign langugage\Data\A"  - #1050 zdjęć
folder_B = "C:\Kodilla\sign langugage\Data\B"    #50 zdjęć
folder_C = "C:\Kodilla\sign langugage\Data\C"    #50 zdjęć
folder_0 = r"C:\Kodilla\sign langugage\Data\0"    #50 zdjęć
# wczytanie obrazów z folderu A
data_A = []
data_B = []
data_C = []
data_0 = []
for file in os.listdir(folder_A):
    img = cv2.imread(os.path.join(folder_A, file))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    data_A.append(img)

# wczytanie obrazów z folderu B
for file in os.listdir(folder_B):
    img = cv2.imread(os.path.join(folder_B, file))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    data_B.append(img)
# wczytanie obrazów z folderu C
for file in os.listdir(folder_C):
    img = cv2.imread(os.path.join(folder_C, file))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    data_C.append(img)

# wczytanie obrazów z folderu 0
for file in os.listdir(folder_0):
    img = cv2.imread(os.path.join(folder_0, file))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    data_0.append(img)    

# łączenie danych z dwóch folderów w jedną tablicę
X = np.array(data_A + data_B + data_C + data_0)

# utworzenie etykiet (0 dla folderu A, 1 dla folderu B)
y = np.array([0]*len(data_A) + [1]*len(data_B) + [2]*len(data_C) + [3]*len(data_0))

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=4, stratify=y)
1

Spróbuj importu funkcji train_test_split() z modułu sklearn.model_selection, która jest wykorzystywana w ostatniej linii kodu.

dodajnastępującą na początku swojego kodu

from sklearn.model_selection import train_test_split
1

zmienna folder_A jest przypisywana wartości "C:\Kodilla\sign langugage\Data\A". znak \ jest używany jako znak specjalny, dlatego należy umieścić przed nim przedrostek r (raw string), aby oznaczyć, że to ma być dosłownie traktowane jako ciąg znaków.

0

Sprawdzę czy to r przed tym coś pomoże

0

Niestety nic to nie pomogło cay czas mam ,że jak chce zrobić , to ponizej to pokazuje błąd odnośnie tych tablic: , Chwilę temu to mi aż komputer się zawiesił podczas trensowania. :D

from sklearn.preprocessing import StandardScaler

lr_model = LogisticRegression()
lr_model.fit(X_train, y_train) # trenowanie modelu

Cały czas mam takie coś:  ValueError: Found array with dim 4. LogisticRegression expected <= 2.
0
folder_A = r"C:\Kodilla\sign langugage\Data\A" #1050 zdjęć
folder_B = r"C:\Kodilla\sign langugage\Data\B" #50 zdjęć
folder_C = r"C:\Kodilla\sign langugage\Data\C" #50 zdjęć
folder_0 = r"C:\Kodilla\sign langugage\Data\0" #50 zdjęć
1
uziom napisał(a):
folder_A = r"C:\Kodilla\sign langugage\Data\A" #1050 zdjęć
folder_B = r"C:\Kodilla\sign langugage\Data\B" #50 zdjęć
folder_C = r"C:\Kodilla\sign langugage\Data\C" #50 zdjęć
folder_0 = r"C:\Kodilla\sign langugage\Data\0" #50 zdjęć

dodałem te r przed '' i mam to samo cały czas , sam nie wiem co z tym jest...

1

Chyba problem leży w zbyt wiele wymiarów w danych wejściowych. LogisticRegression spodziewa się, że dane wejściowe będą miały maksymalnie dwa wymiary, natomiast dane wejściowe mają cztery wymiary.

Trzeba jakoś spłaszczyć dane wejściowe do dwóch wymiarów. Może na przykład za pomocą metody reshape() w bibliotece NumPy, jeśli dane wejściowe mają odpowiedni kształt. Na przykład, jeśli dane wejściowe są w formacie (liczba próbek, szerokość, wysokość, liczba kanałów), można użyć reshape(), aby spłaszczyć je do postaci (liczba próbek, szerokośćwysokośćliczba kanałów

import numpy as np

X_train_flat = np.reshape(X_train, (X_train.shape[0], -1))
0

ok. sprawdze

1

Aby spłaszczyć zdjęcia do dwóch wymiarów, jest metoda reshape() z biblioteki NumPy, tak jak w poprzednim poście . Jednakże, zanim zastosujesz reshape(), musisz upewnić się, że wymiary twojego zbioru zdjęć są takie same dla każdego zdjęcia.

Jeśli zdjęcia są w formacie (liczba próbek, szerokość, wysokość, liczba kanałów), to musisz najpierw zredukować wymiar kanałów, jeśli chcesz pozbyć się tego wymiaru i spłaszczyć zdjęcia do dwóch wymiarów. Możesz to zrobić, używając metody mean() z biblioteki NumPy, aby obliczyć średnią po trzecim wymiarze i zmniejszyć wymiar kanałów do jednego

import numpy as np

X_train_flat = np.mean(X_train, axis=3)

Następnie reshape(), aby spłaszczyć każde zdjęcie do jednego wymiaru

X_train_flat = np.reshape(X_train_flat, (X_train.shape[0], -1))
0

jhjhjhj.png

0

Możesz skopiować tutaj to?

0
uziom napisał(a):

Możesz skopiować tutaj to?

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=4)
X_train_flat = np.mean(X_train, axis=3)
X_train_flat = np.reshape(X_train, (X_train.shape[0], -1))
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler

lr_model = LogisticRegression()
lr_model.fit(X_train_flat, y_train) # trenowanie modelu

C:\Users\Dawid Dymke\AppData\Local\Programs\Python\Python310\lib\site-packages\sklearn\linear_model_logistic.py ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
n_iter_i = _check_optimize_result(

0

Zrobiłem jak poniżej ,ale obliczyło mi tylko jedną metrykę accuracy , a co do pozostałych to mam błąd

Accuracy: 0.9646464646464646
ValueError: Target is multiclass but average='binary'. Please choose another average setting, one of [None, 'micro', 'macro', 'weighted'].

X_train_flat = np.reshape(X_train, (X_train.shape[0], -1))

from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler

lr_model = LogisticRegression()
lr_model.fit(X_train_flat, y_train) # trenowanie modelu

X_test_flat = np.mean(X_test, axis=3)
X_test_flat = np.reshape(X_test, (X_test.shape[0], -1))

y_predict_test = lr_model.predict(X_test_flat)

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

print('Accuracy: ', accuracy_score(y_test, y_predict_test))
print("Precision:", precision_score(y_test, y_predict_test))
print("Recall:", recall_score(y_test, y_predict_test))
print("F1_score:", f1_score(y_test, y_predict_test))
1

Można spróbować zwiększyć maksymalną liczbę iteracji, podając większą wartość dla argumentu "max_iter" w funkcji "LogisticRegression()". Na przykład

lr_model = LogisticRegression(max_iter=1000)

Spróbować zmienić solver na inny, np. "saga" lub "liblinear". Dodając argument "solver" do funkcji "LogisticRegression()"

lr_model = LogisticRegression(solver='saga')
1

kod, który powinien obliczyć wszystkie metryki dla problemu wieloklasowego

X_train_flat = np.reshape(X_train, (X_train.shape[0], -1))

from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler

lr_model = LogisticRegression()
lr_model.fit(X_train_flat, y_train) # trenowanie modelu

X_test_flat = np.mean(X_test, axis=3)
X_test_flat = np.reshape(X_test, (X_test.shape[0], -1))

y_predict_test = lr_model.predict(X_test_flat)

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

print('Accuracy: ', accuracy_score(y_test, y_predict_test))
print("Precision:", precision_score(y_test, y_predict_test, average='macro'))
print("Recall:", recall_score(y_test, y_predict_test, average='macro'))
print("F1_score:", f1_score(y_test, y_predict_test, average='macro'))

Lub

 X_train_flat = np.reshape(X_train, (X_train.shape[0], -1))

from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler

lr_model = LogisticRegression()
lr_model.fit(X_train_flat, y_train) # trenowanie modelu

X_test_flat = np.mean(X_test, axis=3)
X_test_flat = np.reshape(X_test, (X_test.shape[0], -1))

y_predict_test = lr_model.predict(X_test_flat)

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

print('Accuracy: ', accuracy_score(y_test, y_predict_test))
print("Precision:", precision_score(y_test, y_predict_test, average='weighted'))
print("Recall:", recall_score(y_test, y_predict_test, average='weighted'))
print("F1_score:", f1_score(y_test, y_predict_test, average='weighted'))
0

sprawdzę już , ale pewnie będzie już ok. moment bo mi trochę muli

0

Działa , dzięki za pomoc

1

Super

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