Es wird als Einmachblatt verwendet.
Der Entscheidungsbaum ist ein Modell für maschinelles Lernen, das häufig bei der Klassifizierung und Regressionsvorhersage verwendet wird. Es hat eine ** hierarchische Struktur **, die aus Fragen besteht, die mit Ja / Nein beantwortet werden können. Im Entscheidungsbaum können Sie sehen, wie stark sich jede erklärende Variable auf die Zielvariable auswirkt. Sie verzweigt sich durch Wiederholen der Division, aber die zuerst geteilte Variable hat mehr Einfluss. Es kann als groß angesehen werden.
Dieser Klassifizierer kann als Klassifizierungsmodell ** ausgedrückt werden, das 4 Datenklassen durch drei Merkmalsgrößen unterscheidet **. Unter Verwendung eines Algorithmus für maschinelles Lernen kann ein solches Modell Trainingsdaten lernen und tatsächlich einen Baum zeichnen, wie oben beschrieben.
- Relativ einfach zu interpretieren, da der Entscheidungsbaum die Ergebnisse ** visualisieren ** kann
- Nicht von unterschiedlichen Funktionsskalen betroffen, keine Vorverarbeitung wie Standardisierung erforderlich **
- ** Starkes Vertrauen in Trainingsdaten ** Unabhängig davon, wie Sie die Parameter einstellen, erhalten Sie möglicherweise nicht die gewünschte Baumstruktur
- ** Leicht zu überlernen ** Neigt dazu, eine geringe Generalisierungsleistung zu haben
Die Verwirrungsmatrix ist eine Grundmatrix, wenn die Bewertung eines Klassifizierungsmodells berücksichtigt wird, und repräsentiert die Beziehung zwischen dem vorhergesagten Wert und dem beobachteten Wert des Modells. Insbesondere gibt es, wie in der folgenden Abbildung gezeigt, vier Kategorien: ** wahr positiv ** (wahr positiv), ** wahr negativ ** (wahr negativ), ** falsch positiv ** (falsch positiv), ** falsch Hat ein negatives ** (falsches Negativ).
Es ist das Verhältnis der Vorhersage zum Ganzen und kann wie folgt berechnet werden.
Das Verhältnis der als positiv vorhergesagten Daten ist tatsächlich positiv und kann wie folgt berechnet werden.
Es ist das Verhältnis von denen, die tatsächlich positiv sind, und denen, von denen vorhergesagt wird, dass sie positiv sind, und kann wie folgt berechnet werden.
Ein Datensatz, der die diagnostischen Daten für Brustkrebs von Scikit-Learn zusammenfasst. Es ist gutartig (1) und bösartig (0).
[In]
#Bibliothek für die Datenverarbeitung
import pandas as pd
import numpy as np
#Bibliothek zur Datenvisualisierung
import matplotlib.pyplot as plt; plt.style.use('ggplot')
import matplotlib.gridspec as gridspec
import seaborn as sns
%matplotlib inline
#Bibliothek für maschinelles Lernen
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn import metrics
[In]
#Konstante
RESPONSE_VARIABLE = 'cancer' #Objektive Variable
TEST_SIZE = 0.2
RANDOM_STATE = 42
[In]
#Daten lesen(scikit-Krebsdaten lernen)
from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()
cancer = pd.DataFrame(data=data.data, columns=data.feature_names)
cancer[RESPONSE_VARIABLE] = data.target
#Zeige die ersten 5 Zeilen
cancer.head()
mean radius | mean texture | mean perimeter | mean area | mean smoothness | mean compactness | mean concavity | mean concave points | mean symmetry | mean fractal dimension | ... | cancer | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 17.99 | 10.38 | 122.8 | 1001 | 0.1184 | 0.2776 | 0.3001 | 0.1471 | 0.2419 | 0.07871 | ... | 0 |
1 | 20.57 | 17.77 | 132.9 | 1326 | 0.08474 | 0.07864 | 0.0869 | 0.07017 | 0.1812 | 0.05667 | ... | 0 |
2 | 19.69 | 21.25 | 130 | 1203 | 0.1096 | 0.1599 | 0.1974 | 0.1279 | 0.2069 | 0.05999 | ... | 0 |
3 | 11.42 | 20.38 | 77.58 | 386.1 | 0.1425 | 0.2839 | 0.2414 | 0.1052 | 0.2597 | 0.09744 | ... | 0 |
4 | 20.29 | 14.34 | 135.1 | 1297 | 0.1003 | 0.1328 | 0.198 | 0.1043 | 0.1809 | 0.05883 | ... | 0 |
[In]
#Überprüfen Sie die Statistiken
cancer.describe()
mean radius | mean texture | mean perimeter | mean area | mean smoothness | mean compactness | mean concavity | mean concave points | mean symmetry | mean fractal dimension | ... | cancer | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 569 | 569 | 569 | 569 | 569 | 569 | 569 | 569 | 569 | 569 | ... | 569 |
mean | 14.12729 | 19.28965 | 91.96903 | 654.8891 | 0.09636 | 0.104341 | 0.088799 | 0.048919 | 0.181162 | 0.062798 | ... | 0.627417 |
std | 3.524049 | 4.301036 | 24.29898 | 351.9141 | 0.014064 | 0.052813 | 0.07972 | 0.038803 | 0.027414 | 0.00706 | ... | 0.483918 |
min | 6.981 | 9.71 | 43.79 | 143.5 | 0.05263 | 0.01938 | 0 | 0 | 0.106 | 0.04996 | ... | 0 |
25% | 11.7 | 16.17 | 75.17 | 420.3 | 0.08637 | 0.06492 | 0.02956 | 0.02031 | 0.1619 | 0.0577 | ... | 0 |
50% | 13.37 | 18.84 | 86.24 | 551.1 | 0.09587 | 0.09263 | 0.06154 | 0.0335 | 0.1792 | 0.06154 | ... | 1 |
75% | 15.78 | 21.8 | 104.1 | 782.7 | 0.1053 | 0.1304 | 0.1307 | 0.074 | 0.1957 | 0.06612 | ... | 1 |
max | 28.11 | 39.28 | 188.5 | 2501 | 0.1634 | 0.3454 | 0.4268 | 0.2012 | 0.304 | 0.09744 | ... | 1 |
[In]
#Anzahl der objektiven Variablen
cancer[RESPONSE_VARIABLE].value_counts()
[Out]
1 357
0 212
Name: cancer, dtype: int64
[In]
#Bestätigung fehlender Werte
cancer.isnull().sum()
[Out]
mean radius 0
mean texture 0
mean perimeter 0
mean area 0
mean smoothness 0
mean compactness 0
mean concavity 0
mean concave points 0
mean symmetry 0
mean fractal dimension 0
radius error 0
texture error 0
perimeter error 0
area error 0
smoothness error 0
compactness error 0
concavity error 0
concave points error 0
symmetry error 0
fractal dimension error 0
worst radius 0
worst texture 0
worst perimeter 0
worst area 0
worst smoothness 0
worst compactness 0
worst concavity 0
worst concave points 0
worst symmetry 0
worst fractal dimension 0
cancer 0
dtype: int64
[In]
#Unterteilt in Trainingsdaten und Testdaten
train, test = train_test_split(cancer, test_size=TEST_SIZE, random_state=RANDOM_STATE)
#Teilen Sie in erklärende Variablen und objektive Variablen
X_train = train.drop(RESPONSE_VARIABLE, axis=1)
y_train = train[RESPONSE_VARIABLE].copy()
X_test = test.drop(RESPONSE_VARIABLE, axis=1)
y_test = test[RESPONSE_VARIABLE].copy()
[In]
#Visualisieren Sie die Verteilung der Zielvariablen für jedes Feature
features = X_train.columns
legend= ['Benign','Malignant']
plt.figure(figsize=(20,32*4))
gs = gridspec.GridSpec(32, 1)
for i, col in enumerate(train[features]):
ax = plt.subplot(gs[i])
sns.distplot(train[col][train.cancer == 0],bins=50, color='crimson')
sns.distplot(train[col][train.cancer == 1],bins=50, color='royalblue')
plt.legend(legend)
Mit "RandomForestClassifier ()" von Scikit-learn ist es möglich, die "Wichtigkeit" jedes Feature-Betrags als "feature_importances_" zu bestätigen.
[In]
#Merkmalsauswahl
RF = RandomForestClassifier(n_estimators = 250, random_state = 42)
RF.fit(X_train, y_train)
:[Out]
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
max_depth=None, max_features='auto', max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=250, n_jobs=None,
oob_score=False, random_state=42, verbose=0, warm_start=False)
[In]
#Ausgabefunktionen in absteigender Reihenfolge der Wichtigkeit
features = X_train.columns
importances = RF.feature_importances_
importances_features = sorted(zip(map(lambda x: round(x, 2), RF.feature_importances_), features), reverse=True)
for i in importances_features:
print(i)
[Out]
(0.13, 'worst perimeter')
(0.13, 'worst concave points')
(0.13, 'worst area')
(0.11, 'mean concave points')
(0.07, 'worst radius')
(0.05, 'mean radius')
(0.05, 'mean concavity')
(0.04, 'worst concavity')
(0.04, 'mean perimeter')
(0.04, 'mean area')
(0.02, 'worst texture')
(0.02, 'worst compactness')
(0.02, 'radius error')
(0.02, 'mean compactness')
(0.02, 'area error')
(0.01, 'worst symmetry')
(0.01, 'worst smoothness')
(0.01, 'worst fractal dimension')
(0.01, 'perimeter error')
(0.01, 'mean texture')
(0.01, 'mean smoothness')
(0.01, 'fractal dimension error')
(0.01, 'concavity error')
(0.0, 'texture error')
(0.0, 'symmetry error')
(0.0, 'smoothness error')
(0.0, 'mean symmetry')
(0.0, 'mean fractal dimension')
(0.0, 'concave points error')
(0.0, 'compactness error')
Top 5 Ergebnisse der zufälligen Auswahl von Waldmerkmalen
[In]
#Holen Sie sich die Top 5 als Liste
feature_list = [value for key, value in important_features if key >= 0.06]
feature_list
[Out]
['worst perimeter',
'worst concave points',
'worst area',
'mean concave points',
'worst radius']
[In]
#Konzentrieren Sie Trainings- und Testdaten nur auf die wichtigsten Funktionen
X_train = X_train[feature_list]
X_test = X_test[feature_list]
[In]
#Überprüfen Sie erneut die Verteilung der Zielvariablen
legend= ['Benign','Malignant']
plt.figure(figsize=(20,32*4))
gs = gridspec.GridSpec(32, 1)
for i, col in enumerate(train[feature_list]):
ax = plt.subplot(gs[i])
sns.distplot(train[col][train.cancer == 0],bins=50, color='crimson')
sns.distplot(train[col][train.cancer == 1],bins=50, color='royalblue')
plt.legend(legend)
[In]
#Lernen
clf = DecisionTreeClassifier(max_depth=4)
clf = clf.fit(X_train, y_train)
[In]
#Vorausgesagt anhand der Funktionen von Trainingsdaten
y_pred = clf.predict(X_train)
[In]
def drawing_confusion_matrix(y: pd.Series, pre: np.ndarray) -> None:
"""
Eine Funktion, die eine Verwirrungsmatrix zeichnet
@param y:Objektive Variable
@param pre:Erwarteter Wert
"""
confmat = confusion_matrix(y, pre)
fig, ax = plt.subplots(figsize=(5, 5))
ax.matshow(confmat, cmap=plt.cm.Blues, alpha=0.3)
for i in range(confmat.shape[0]):
for j in range(confmat.shape[1]):
ax.text(x=j, y=i, s=confmat[i, j], va='center', ha='center')
plt.title('Predicted value')
plt.ylabel('Measured value')
plt.rcParams["font.size"] = 15
plt.tight_layout()
plt.show()
[In]
def calculation_evaluations(y: pd.Series, pre: np.ndarray) -> None:
"""
Eine Funktion, die die richtige Antwortrate, Präzisionsrate und Rückrufrate berechnet und ausgibt.
@param y:Objektive Variable
@param pre:Erwarteter Wert
"""
print('Richtige Antwortrate: {:.3f}'.format(metrics.accuracy_score(y, pre)))
print('Compliance-Rate: {:.3f}'.format(metrics.precision_score(y, pre)))
print('Erinnern: {:.3f}'.format(metrics.recall_score(y, pre)))
[In]
drawing_confusion_matrix(y_train, y_pred)
calculation_evaluations(y_train, y_pred)
:[Out]
Richtige Antwortrate: 0.969
Compliance-Rate: 0.979
Erinnern: 0.972
163 in TP (oben links) ist die tatsächliche Anzahl der bösartigen, die das Modell als bösartig vorausgesagt hat. 9 in FP (unten rechts) ist eine Zahl, die als bösartig und nicht als tatsächlich bösartig vorhergesagt wird. Die FN (oben rechts) von 6 ist tatsächlich bösartig, wird jedoch als gutartig vorausgesagt.
[In]
#Vorhersage von Testdaten mit einem trainierten Modell
y_pred_test = clf.predict(X_test)
[In]
drawing_confusion_matrix(y_test, y_pred_test)
calculation_evaluations(y_test, y_pred_test)
[Out]
Richtige Antwortrate: (TP + TN)/(TP + TN + FP + FN)
Richtige Antwortrate: 0.939
Compliance-Rate: TP/(TP + FP)
Compliance-Rate: 0.944
Erinnern: TP/(TP + FN)
Erinnern: 0.958
Recommended Posts