Классификация ядовитых грибов на основе 6 контролируемых методов обучения

машинное обучение
Классификация ядовитых грибов на основе 6 контролируемых методов обучения

Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер

Всем привет, меня зовут Питер~

Эта статья является третьей частью обмена кейсами kaggle Название конкурса: Классификация грибов, безопасно есть или смертельный яд?

Данные UCI:archive.ICS.UCI.credits/beauty/datasets…

Исходный адрес Kaggle:Woohoo.Карта реформирована.com/Ты доставляешь неприятности Джуну...

ранжирование

Ниже приведен рейтинг на kaggle по этому вопросу. Первое место посвящено выбору признаков. Я не использую данные в этом вопросе. Лично я чувствую, что сбился с пути; второе место сосредоточено на классификации, основанной на байесовской теории, с ограниченными возможностями.

Поэтому я выбрал исходный код блокнота третьего места для изучения. Автор сравнивает моделирование, оценку модели и другие процессы шести контролируемых методов обучения в этом наборе данных.

набор данных

Этот набор данных был подарен kaggle UCI. Общее количество образцов 8124, из них 6513 образцов используются для обучения и 1611 образцов используются для тестирования, из них съедобных 4208 образцов, что составляет 51,8 %, ядовитых 3916 образцов, что составляет 48,2 %. Каждый образец описывает 22 свойства грибов, таких как форма, запах и т. д.

Время от времени происходит случайное отравление дикорастущими грибами, причем грибы имеют различную форму.Для непрофессионалов невозможно отличить ядовитые грибы от съедобных по внешнему виду, форме, цвету и т. д. Не существует простого эталона отличать ядовитые грибы от съедобных. Чтобы понять, съедобны ли грибы, необходимо собрать грибы с разными характерными свойствами и проанализировать их на токсичность.

Анализируются 22 характерных признака грибов, чтобы получить модель удобства использования грибов, которая может лучше предсказать, съедобны ли грибы.

Ниже приведены конкретные данные, отображаемые UCI:

Объяснение характеристик атрибута:

Данные ЭДА

Импорт данных

import pandas as pd
import numpy as np

import plotly_express as px
from matplotlib import pyplot as plt
import seaborn as sns

# 忽略警告
import warnings
warnings.filterwarnings('ignore')

Необработанные данные содержат 8124 записи, 23 атрибута иНет пропущенных значений

Нет токсичного сравнения

Статистическое сравнение количества токсичных и нетоксичных:

Визуальный анализ

цвет кепки

Сначала обсудим цвет шапки:Количество раз каждого цвета кепки

fig = px.bar(cap,x="color",
             y="number",
             color="number",
             text="number",
             color_continuous_scale="rainbow")

# fig.update_layout(text_position="outside")
fig.show()

Какого цвета самые ядовитые грибы? Статистическое распределение цвета при токсичности и нетоксичности:

 fig = px.bar(cap_class,x="color",
              y="number",
              color="class",
              text="number",
              barmode="group",
             )

fig.show()

резюме:Цвета n, g, e чаще встречаются в случае ядовитых p.

запах бактерий

Подсчитайте количество каждого аромата:

fig = px.bar(odor,
             x="odor",
             y="number",
             color="number",
             text="number",
             color_continuous_scale="rainbow")

fig.show()

Вышеприведенное относится к общей ситуации с данными, а следующее разделено на токсичные и нетоксичные, чтобы продолжить обсуждение:

 fig = px.bar(odor_class,
              x="odor",
              y="number",
              color="class",
              text="number",
              barmode="group",
             )

fig.show()

Резюме: Из приведенных выше двух рисунков видно, что:f Этот запах, скорее всего,

Характерная корреляция

Постройте коэффициенты корреляции между функциями в виде тепловой карты, чтобы увидеть распределение:

corr = data.corr()
sns.heatmap(corr)

plt.show()

разработка функций

преобразование признаков

Все функции в исходных данных имеют текстовый тип, и мы преобразуем их в числовые типы, чтобы облегчить последующий анализ:

1. Перед преобразованием

2. Реализовать преобразование

from sklearn.preprocessing import LabelEncoder  # 类型编码
labelencoder = LabelEncoder()

for col in data.columns:
    data[col] = labelencoder.fit_transform(data[col])

# 转换后
data.head()

3. Просмотр результатов конвертации некоторых атрибутов

распределение данных

Просмотрите распределение данных после кодирования преобразования данных:

ax = sns.boxplot(x='class', 
                 y='stalk-color-above-ring',
                 data=data)

ax = sns.stripplot(x="class", 
                   y='stalk-color-above-ring',
                   data=data, 
                   jitter=True,
                   edgecolor="gray")

plt.title("Class w.r.t stalkcolor above ring",fontsize=12)

plt.show()

Отдельные функции и ярлыки

X = data.iloc[:,1:23]  # 特征
y = data.iloc[:, 0]  # 标签

нормализация данных

# 归一化(Normalization)、标准化(Standardization)

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(X)
X

Анализ основных компонентов PCA

процесс PCA

22 атрибута в исходных данных могут быть не всеми допустимыми объектами данных, или некоторые атрибуты сами имеют определенную связь, что приводит к перекрытию атрибутов объектов. Мы используем анализ основных компонентов, чтобы сначала определить ключевые особенности:

# 1、实施pca
from sklearn.decomposition import PCA
pca = PCA()
pca.fit_transform(X)

# 2、得到相关系数
covariance = pca.get_covariance()

# 3、得到每个变量对应的方差值
explained_variance=pca.explained_variance_
explained_variance

Постройте отношение оценки для каждого основного компонента:

with plt.style.context("dark_background"):  # 背景
    plt.figure(figsize=(6,4))  # 大小
    
    plt.bar(range(22),  # 主成分个数
           explained_variance,  # 方差值
            alpha=0.5,  # 透明度
            align="center",
            label="individual explained variance"  # 标签
           )
    plt.ylabel('Explained variance ratio')  # 轴名称和图例
    plt.xlabel('Principal components')
    plt.legend(loc="best")
    plt.tight_layout()  # 自动调整子图参数

Вывод: Из приведенного выше рисунка видно, что сумма дисперсии последних 4 главных компонент очень мала, первые 17 занимают более 90% дисперсии и могут быть использованы в качестве главных компонент.

We can see that the last 4 components has less amount of variance of the data.The 1st 17 components retains more than 90% of the data.

Распределение данных по 2 основным компонентам

Затем мы реализуем кластеризацию K-средних с данными на основе двух атрибутов:

1. Исходное распределение данных по 2 главным компонентам

N = data.values
pca = PCA(n_components=2)
x = pca.fit_transform(N)

plt.figure(figsize=(5,5))
plt.scatter(x[:,0],x[:,1])
plt.show()

2. Распределение после реализации кластерного моделирования:

from sklearn.cluster import KMeans
km = KMeans(n_clusters=2,random_state=5)

N = data.values  # numpy数组形式
X_clustered = km.fit_predict(N)  # 建模结果0-1

label_color_map = {0:"g",  # 分类结果只有0和1,进行打标
                  1:"y"}
label_color = [label_color_map[l] for l in X_clustered]

plt.figure(figsize=(5,5))
# x = pca.fit_transform(N)
plt.scatter(x[:,0],x[:,1], c=label_color)
plt.show()

Моделирование на основе 17 основных компонентов

Я сам не понял этого места: всего атрибутов 22, а признаков выше выбрано 4. Почему этот анализ основан на 17 главных компонентах? ?

Сначала сделал преобразование на основе 17 главных компонент:

Разделение набора данных: обучающий набор и тестовый набор составляют 8-2

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=4)

Ниже приводится конкретный процесс шести контролируемых методов обучения:

Модель 1: логистическая регрессия

from sklearn.linear_model import LogisticRegression  # 逻辑回归(分类)
from sklearn.model_selection import cross_val_score  # 交叉验证得分
from sklearn import metrics  # 模型评价

# 建立模型
model_LR = LogisticRegression()
model_LR.fit(X_train, y_train)

Проверьте конкретную эффективность прогноза:

model_LR.score(X_test,y_pred)

# 结果
1.0  # 效果很好

Матрица путаницы при логистической регрессии:

confusion_matrix = metrics.confusion_matrix(y_test, y_pred)
confusion_matrix

# 结果 
array([[815,  30],
       [ 36, 744]])

Конкретное значение AUC:

auc_roc = metrics.roc_auc_score(y_test, y_pred)  # 测试纸和预测值
auc_roc

# 结果
0.9591715976331362

истинное и ложноположительное

from sklearn.metrics import roc_curve, auc
false_positive_rate, true_positive_rate,thresholds = roc_curve(y_test, y_prob)

roc_auc = auc(false_positive_rate,true_positive_rate)
roc_auc

# 结果
0.9903474434835382

ROC-кривая

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
plt.title("ROC")  # Receiver Operating Characteristic
plt.plot(false_positive_rate,
         true_positive_rate,
         color="red",
         label="AUC = %0.2f"%roc_auc
        )

plt.legend(loc="lower right")
plt.plot([0,1],[0,1],linestyle="--")
plt.axis("tight")
# 真阳性:预测类别为1的positive;预测正确True
plt.ylabel("True Positive Rate") 
# 假阳性:预测类别为1的positive;预测错误False
plt.xlabel("False Positive Rate")  

Ниже приводится калибровка модели логистической регрессии. Поправка здесь в основномпоиск по сеткеметод для выбора наилучших параметров, а затем перейти к следующему этапу моделирования. Процесс поиска сетки:

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn import metrics

# 未优化的模型
LR_model= LogisticRegression()
# 待确定的参数
tuned_parameters = {"C":[0.001,0.01,0.1,1,10,100,1000],
                    "penalty":['l1','l2']  # 选择不同的正则方式,防止过拟合
                   }
# 网格搜索模块
from sklearn.model_selection import GridSearchCV
# 加入网格搜索功能
LR = GridSearchCV(LR_model, tuned_parameters,cv=10)
# 搜索之后再建模
LR.fit(X_train, y_train)

# 确定参数
print(LR.best_params_)

{'C': 100, 'penalty': 'l2'}

Проверьте оптимизированный прогноз:

Матрица путаницы и случай AUC:

Ситуация с кривой ROC:

from sklearn.metrics import roc_curve, auc
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)

#roc_auc = auc(false_positive_rate, true_positive_rate)

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
plt.title("ROC")  # Receiver Operating Characteristic
plt.plot(false_positive_rate,
         true_positive_rate,
         color="red",
         label="AUC = %0.2f"%roc_auc
        )

plt.legend(loc="lower right")
plt.plot([0,1],[0,1],linestyle="--")
plt.axis("tight")
# 真阳性:预测类别为1的positive;预测正确True
plt.ylabel("True Positive Rate") 
# 假阳性:预测类别为1的positive;预测错误False
plt.xlabel("False Positive Rate")  

Модель 2: гауссовский наивный байесовский метод

моделирование

from sklearn.naive_bayes import GaussianNB
model_naive = GaussianNB()

# 建模
model_naive.fit(X_train, y_train)

# 预测概率
y_prob = model_naive.predict_proba(X_test)[:,1]  
y_pred = np.where(y_prob > 0.5,1,0)
model_naive.score(X_test,y_pred)

# 结果
1

Количество различных предсказанных и истинных значений: 111

Перекрестная проверка

scores = cross_val_score(model_naive,
                        X,
                        y,
                        cv=10,
                        scoring="accuracy"
                       )
scores

Матрица путаницы и AUC

истинное и ложноположительное

# 导入评价模块
from sklearn.metrics import roc_curve, auc

# 评价指标
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)

# roc曲线面积
roc_auc = auc(false_positive_rate, true_positive_rate)
roc_auc

# 结果
0.9592201486876043

ROC-кривая

Значение AUC составляет всего 0,96.

# 绘图
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))

plt.title("ROC")
plt.plot(false_positive_rate,true_positive_rate,color="red",label="AUC=%0.2f"%roc_auc)

plt.legend(loc="lower right")
plt.plot([0,1],[0,1],linestyle='--')

plt.axis("tight")
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.show()

Модель 3: машина опорных векторов SVM

Процесс SVM с параметрами по умолчанию

процесс моделирования

from sklearn.svm import SVC
svm_model = SVC()

tuned_parameters = {
    'C': [1, 10, 100,500, 1000],
    'kernel': ['linear','rbf'],
    'C': [1, 10, 100,500, 1000], 
    'gamma': [1,0.1,0.01,0.001, 0.0001], 
    'kernel': ['rbf']
}

Рандомизированный поиск по сетке - RandomizedSearchCV

from sklearn.model_selection import RandomizedSearchCV

# 建立随机搜索模型
model_svm = RandomizedSearchCV(
    svm_model,  # 待搜索模型
    tuned_parameters,  # 参数
    cv=10,  # 10折交叉验证
    scoring="accuracy",  # 评分标准
    n_iter=20  # 迭代次数
    )

# 训练模型
model_svm.fit(X_train,y_train)
RandomizedSearchCV(cv=10, 
                   estimator=SVC(), 
                   n_iter=20,
                   param_distributions={'C': [1, 10, 100, 500, 1000],
                                        'gamma': [1, 0.1, 0.01, 0.001, 0.0001],
                                        'kernel': ['rbf']},
                   scoring='accuracy')
# 最佳得分效果
print(model_svm.best_score_)
1.0

Параметры наилучшего соответствия:

# 预测
y_pred = model_svm.predict(X_test)

# 预测值和原始标签值计算:分类准确率
metrics.accuracy_score(y_pred, y_test)
# 结果
1

матрица путаницы

Ознакомьтесь с конкретной матрицей путаницы и прогнозами:

ROC-кривая

from sklearn.metrics import roc_curve, auc
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)
roc_auc = auc(false_positive_rate, true_positive_rate)

import matplotlib.pyplot as plt

plt.figure(figsize=(10,10))
plt.title('ROC')

plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc_auc)

plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')

plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')

Модель 5: Случайный лес

Модельная посадка

from sklearn.ensemble import RandomForestClassifier

# 建模
model_RR = RandomForestClassifier()
# 拟合
model_RR.fit(X_train, y_train)

оценка прогноза

матрица путаницы

ROC-кривая

from sklearn.metrics import roc_curve, auc

false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)

roc_auc = auc(false_positive_rate, true_positive_rate)
roc_auc  # 1

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
plt.title('ROC')

plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc_auc)

plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')

plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()

Модель 6: Дерево решений (CART)

моделирование

from sklearn.tree import DecisionTreeClassifier

# 建模
model_tree = DecisionTreeClassifier()
model_tree.fit(X_train, y_train)

# 预测
y_prob = model_tree.predict_proba(X_test)[:,1]

# 预测的概率转成0-1分类
y_pred = np.where(y_prob > 0.5, 1, 0)
model_tree.score(X_test, y_pred)
# 结果
1

матрица путаницы

Отражение различных показателей оценки:

ROC-кривая

from sklearn.metrics import roc_curve, auc
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)
roc_auc = auc(false_positive_rate, true_positive_rate)
roc_auc  # 1

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))  # 画布
plt.title('ROC')  # 标题

plt.plot(false_positive_rate,  # 绘图
         true_positive_rate, 
         color='red',
         label = 'AUC = %0.2f' % roc_auc)  

plt.legend(loc = 'lower right') #  图例位置
plt.plot([0, 1], [0, 1],linestyle='--')  # 正比例直线

plt.axis('tight')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.show()

Модель 6: ИНС нейронной сети

моделирование

матрица путаницы

ROC-кривая

 # 真假阳性
from sklearn.metrics import roc_curve, auc
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)
roc_auc = auc(false_positive_rate, true_positive_rate)
roc_auc  # 1

# 绘制ROC曲线

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
plt.title('ROC')
plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc_auc)

plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')

plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()

Параметры нейронной сети настроены следующим образом:

  • hidden_layer_sizes: количество скрытых слоев
  • активация: функция активации
  • альфа: скорость обучения
  • max_iter: максимальное количество итераций

поиск по сетке

from sklearn.neural_network import MLPClassifier

# 实例化
mlp_model = MLPClassifier()
# 待调节参数
tuned_parameters={'hidden_layer_sizes': range(1,200,10),
                  'activation': ['tanh','logistic','relu'],
                  'alpha':[0.0001,0.001,0.01,0.1,1,10],
                  'max_iter': range(50,200,50)
}

model_mlp= RandomizedSearchCV(mlp_model,
                              tuned_parameters,
                              cv=10,
                              scoring='accuracy',
                              n_iter=5,
                              n_jobs= -1,
                              random_state=5)
model_mlp.fit(X_train,y_train)

Свойства модели

Свойства модели после настройки и соответствующие параметры:

ROC-кривая

from sklearn.metrics import roc_curve, auc
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)
roc_auc = auc(false_positive_rate, true_positive_rate)
roc_auc  # 1

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
plt.title('ROC')

plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc_auc)

plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')

plt.axis('tight')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')

Матрица путаницы и ROC

Вот хорошая статья, объясняющая матрицу путаницы и ROC:Wooooooo.cn blog on.com/ TT ах OTA в доме…

1. Что такое матрица путаницы?

2. 4 основных показателя

TP, FP, TN, FN, вторая буква указывает на прогнозируемую категорию выборки, а первая буква указывает, соответствует ли прогнозируемая категория выборки реальной категории.

3. Точность

4. Точность и отзыв

5. Ф_1 и Ф_Б

6. ROC-кривая

Полное название AUC — Area Under Curve, которое представляет собой площадь под кривой.Значение AUC кривой ROC можно использовать для оценки модели. Кривая ROC показана на рисунке 1:

Суммировать

После прочтения исходного кода этой записной книжки вам необходимо знать точки знаний:

  • Общая идея моделирования машинного обучения: выбор модели, моделирование, настройка параметров поиска по сетке, оценка модели, ROC-кривая (классификация)
  • Методы разработки признаков: преобразование кодировки, стандартизация данных, разделение набора данных.
  • Показатели оценки:Матрица путаницы, кривая ROCВ качестве акцента последующие статьи будут посвящены объяснению

Примечание: Питер сам напишет специальную статью для моделирования и анализа этих данных, чисто оригинальных идей, с нетерпением жду ~