Michał Bieroński, 218324
Mateusz Burniak, 218321
Znane są poprawne wartości dla danych uczących.
Nie są znane dane wyjściowe.
Metoda prób i błędów.
Szukamy funkcji opisującej zależność jednej zmiennej w zależności od innych zmiennych (często pozornie nie związanych ze sobą)
Podział danych względem
najbardziej znaczących atrybutów.
Połączenie wielu drzew decyzyjnych w multiklasyfikator.
Retinopatia cukrzycowa
Retinopatia cukrzycowa
Retinopatia cukrzycowa
Retinopatia cukrzycowa
Jednym z zastosowań uczenia maszynowego w medycynie jest klasyfikacja raka piersi
Procentowy rozkład zachorowań na nowotwory
ML w praktyce
Problem klasyfikacji złośliwości raka piersi
#header oznacza, że wiersz 0 będzie zawierać etykiety dla naszych danych
data = pd.read_csv("../input/data.csv",header=0)
#możemy teraz wypisać sobie przykładowo 2 wiersze danych
print(data.head(2))
#teraz chcielibyśmy uzyskać trochę informacji o wczytanych danych
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 569 entries, 0 to 568
Data columns (total 33 columns):
id 569 non-null int64
diagnosis 569 non-null object
radius_mean 569 non-null float64
texture_mean 569 non-null float64
perimeter_mean 569 non-null float64
area_mean 569 non-null float64
smoothness_mean 569 non-null float64
...
texture_worst 569 non-null float64
concave points_worst 569 non-null float64
symmetry_worst 569 non-null float64
fractal_dimension_worst 569 non-null float64
Unnamed: 32 0 non-null float64
dtypes: float64(31), int64(1), object(1)
memory usage: 146.8+ KB
Let's code!
#usuwamy pustą, nadmiarową kolumnę o nazwie "Unnamed: 32"
data.drop("Unnamed: 32",axis=1,inplace=True)
#sprawdźmy czy kolumna została porzucona
data.columns
Index(['id', 'diagnosis', 'radius_mean', 'texture_mean', 'perimeter_mean',
'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean',
'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean',
'radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se',
'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se',
'fractal_dimension_se', 'radius_worst', 'texture_worst',
'perimeter_worst', 'area_worst', 'smoothness_worst',
'compactness_worst', 'concavity_worst', 'concave points_worst',
'symmetry_worst', 'fractal_dimension_worst'],
dtype='object')
#analogicznie pozbywamy się kolumny id
data.drop("id",axis=1,inplace=True)
Selekcja cech
#Dzielimy cechy według odpowiednich kategorii
features_mean = list(data.columns[1:11])
features_se = list(data.columns[11:20])
features_worst = list(data.columns[21:31])
print(features_mean)
print("-----------------------------------")
print(features_se)
print("------------------------------------")
print(features_worst)
['radius_mean', 'texture_mean', 'perimeter_mean', 'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean', 'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean']
-----------------------------------
['radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se', 'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se']
------------------------------------
['radius_worst', 'texture_worst', 'perimeter_worst', 'area_worst', 'smoothness_worst', 'compactness_worst', 'concavity_worst', 'concave points_worst', 'symmetry_worst', 'fractal_dimension_worst']
#Na koniec mapujemy typy diagnozy na łatwiejsze do przetwarzania
data['diagnosis'] = data['diagnosis'].map({'M':1,'B':0})
Selekcja cech
#Narysujmy sobie wykres częstości występowania danego typu diagnoz
sns.countplot(data['diagnosis'],label="Count")
Analiza danych
#Teraz wykorzystamy funkcje corr do znalezienia korelacji pomiędzy cechami
corr = data[features_mean].corr()
#A następnie utworzymy sobie tzw. heatmap'e,
#która ładnie nam też zależności przedstawi
plt.figure(figsize=(14,14))
sns.heatmap(corr, cbar = True,
square = True,
annot=True,
fmt= '.2f',
annot_kws={'size': 15},
xticklabels= features_mean,
yticklabels= features_mean,
cmap= 'coolwarm')
Analiza danych
#od teraz będziemy używać tylko tych cech
prediction_var = ['texture_mean','perimeter_mean','smoothness_mean',
'compactness_mean','symmetry_mean']
#dzielimy zbiór danych
train, test = train_test_split(data, test_size = 0.3)
train_X = train[prediction_var] # cechy wejściowe
train_y=train.diagnosis # spodziewane wyjścia
#tak samo dla zbioru testowego
test_X= test[prediction_var]
test_y =test.diagnosis
Odrzucamy nadmiarowe cechy
#Tworzymy model klasyfikatora
model=RandomForestClassifier(n_estimators=100)
#Trenujemy model
model.fit(train_X,train_y)
#dokonujemy predykcji na zbiorze testowym
prediction = model.predict(test_X)
#Mierzymy otrzymaną poprawnosc klasyfikatora
metrics.accuracy_score(prediction,test_y)
0.92982456140350878
Trenujemy i testujemy model
łagodny
złośliwy
Michał Bieroński, 218324
Mateusz Burniak, 218321