Изучите алгоритм интеллектуального анализа данных 1-KNN с нуля

искусственный интеллект
Изучите алгоритм интеллектуального анализа данных 1-KNN с нуля

Введение в алгоритм KNN

KNN — это алгоритм ближайшего соседа (K-Nearest Neighbor).Основная идея этого алгоритма заключается в том, что вещи группируются вместе.Те, кто близко к Чжу, — красные, а те, кто близко к чернилам, — черные.

图片.png

Непосредственно вычислите выборочные расстояния K расстояний от неизвестных точек и выберите категорию с наибольшим расстоянием до ближайшей точки выборки в качестве категории новых данных.

Например, на рисунке, если мы установим значение K равным 1, то оно будет отнесено к классу 2. Если значение k равно 5, то число класса 1 будет больше, чем количество класса 2, тогда оно будет классифицируется по классу 1, а значение K определяет дальность излучения расстояния, влияющую на точность результатов классификации

Преимущества и недостатки КНН

Преимущества КНН

  • KNN прост и удобен в реализации.Алгоритм KNN не строит никакой модели, а рассматривает прошлые исторические данные как саму модель и сравнивает новые данные с каждыми историческими данными без какого-либо обучения, просто можно напрямую получить новые неизвестные данные. быть предсказанным
  • KNN хорошо влияет на данные с нерегулярными границами, по сравнению с линейными алгоритмами на графике трудно различить данные с нерегулярными границами.

Недостатки КНН

  • Он подходит только для небольших наборов данных, потому что его легко реализовать каждый раз, когда для прогнозирования новых данных нужно только сравнить все наборы данных, поэтому, когда набор данных очень большой, прогнозирование займет очень много времени и займет очень большой объем данных. установить место для хранения
  • Эффект предсказания несбалансированных данных не очень хорош.Например, когда количество выборок определенных данных очень велико, его конкурентное преимущество будет намного больше, чем у других данных, что приведет к отказу алгоритма KNN.
  • Данные должны быть стандартизированы, потому что для расчета используется расстояние.Если измерение поля данных отличается, влияние поля с большим значением станет больше, поэтому данные необходимо стандартизировать, например, это конвертируется в интервал 0-1
  • Это не подходит для данных со слишком большим количеством размерностей объектов. Если размерностей данных слишком много, распределение выборок данных в каждом измерении будет очень маленьким. Например, у нас есть 3 выборки, и каждая выборка имеет только одно измерение, что лучше, чем иметь 1 образец.И выборка имеет три измерения, первые признаки гораздо более очевидны.

Выбор значения K повлияет на эффект модели

图片.png

На картинке мы видим, что богатая область находится слева, а простые люди справа.Число обычных людей будет намного больше, чем богатых.Если мы установим значение K равным 1, то если дом богача построен будет у реки и очень близко к простым людям, и его будут судить как простых людей, то возможность быть судимым по богатому району будет становиться все меньше и меньше, и все новых людей будут судить как обычных людей, в результате чего вся модель выйдет из строя.

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

Чем больше K, тем легче недообучить, потому что меньшее внимание равно нулю

Попробуйте ручное кодирование

Сначала мы импортируем основные зависимости,sklearnЯвляетсяPythonОчень мощная библиотека машинного обучения, предоставленная третьей стороной, она включает в себя все аспекты от предварительной обработки данных до обучающих моделей, а также содержит множество базовых наборов данных, которые мы можем изучить и использовать.

# sklearn的数据集
from sklearn import datasets
# sklearn模块的KNN模型
from sklearn.neighbors import KNeighborsClassifier
# 矩阵运算工具库 numpy
import numpy as np

np.random.seed(0)
# 设置随机种子,不设置的话是按照系统时间作参数,有随机种子可以保证我们每次运行结果是一样的

Выбираем базу данных iris в качестве первого эксперимента, импортируем и просматриваем структуру

# sklearn的数据集
from sklearn import datasets
# sklearn模块的KNN模型
from sklearn.neighbors import KNeighborsClassifier
# 矩阵运算工具库 numpy
import numpy as np

np.random.seed(0)
# 设置随机种子,不设置的话是按照系统时间作参数,有随机种子可以保证我们每次运行结果是一样的

# 获取鸢尾花数据集
iris = datasets.load_iris()
# 查看结构
print(iris)

Вы можете увидеть данные объекта и цель данных метки, а также имя, соответствующее метке.

{'data': array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2],
       .............
       [4.6, 3.1, 1.5, 0.2]]), 'target': array([0, 0, 0..... 2, 2, 2, 2]),
       'target_names': array(['setosa', 'versicolor', 'virginica']

Например, первый фрагмент данных имеет 4 признака [5.1, 3.5, 1.4, 0.2]. Давайте не будем знать, какие атрибуты радужной оболочки записываются этими 4 признаками. Соответствующая метка 0, что означает setosa (горный ирис)

图片.png

Затем наша идея состоит в том, чтобы рассчитать каждую характеристику новой радужной оболочки путем вычислениярасстояниеРазница между характеристиками радужной оболочки каждого образца накапливается, и ближайшие K являются ближайшими K. Например, ближайшие 5 - это радужная оболочка с меткой 0, тогда мы можем считать ее радужной оболочкой.

# sklearn的数据集
from sklearn import datasets
# sklearn模块的KNN模型
from sklearn.neighbors import KNeighborsClassifier
# 矩阵运算工具库 numpy
import numpy as np

np.random.seed(0)
# 设置随机种子,不设置的话是按照系统时间作参数,有随机种子可以保证我们每次运行结果是一样的

# 获取鸢尾花数据集
iris = datasets.load_iris()
# 特征数据
iris_datas = iris.data
# 标签数据
iris_targets = iris.target
# 标签名称
iris_names = iris.target_names

# 查看特征数据数量
print("查看特征数据数量:", len(iris_datas))
# 查看标签名称
print("查看标签名称:", iris_names)

# 从150条数据中选择140条作为训练集,10条作为测试集。

# permutation方法接收一个数作为参数【这里我就直接使用特征数据的数量】,产生一个0-149乱序的一维数组
randomArr = np.random.permutation(len(iris_datas))
# 切割出训练集的特征数据 0~倒数第10个截止,也就是切割140个
iris_train_datas = iris_datas[randomArr[:-10]]
# 切割出训练集标签数据
iris_train_target = iris_targets[randomArr[:-10]]

# 切割出测试集的特征数据 倒数第十个开始 往后获取全部,也就是最后10个数据
iris_test_datas = iris_datas[randomArr[-10:]]
# 切割出测试集的标签数据
iris_test_target = iris_targets[randomArr[-10:]]

# 用Sklearn训练好的KNN模型 定义一个KNN分类器 在这里我们设置超参数K值为5
knn = KNeighborsClassifier(5)
# 调用knn对象的训练方法,主要接收两个参数,训练数据集和训练标签集
knn.fit(iris_train_datas, iris_train_target)

# 调用预测方法,主要接收一个参数 测试数据集
iris_test_predict = knn.predict(iris_test_datas)
# 计算各测试样本的预测概率值,这里我没有用概率值,但是在实际工作中可能会参考概率值进行最后的结果筛选,而不是直接使用给出的标签
property = knn.predict_proba(iris_test_datas)
print(property)

Запустим код и посмотрим результат

图片.png

Вы можете увидеть десять частей тестовых данных.После оценки вероятности [0-1], полученной нашей моделью KNN, модель считает, что первая часть данных имеет 100% вероятность пестрого ириса, а вторая часть данных имеет 40% вероятность того, что это пестролистный ирис, 60% вероятность того, что это виргинский ирис

Мы не можем невооруженным глазом судить, правильно ли это, поэтому sklearn имеет встроенный набор методов сравнительной оценки.

# sklearn的数据集
from sklearn import datasets
# sklearn模块的KNN模型
from sklearn.neighbors import KNeighborsClassifier
# 矩阵运算工具库 numpy
import numpy as np

np.random.seed(0)
# 设置随机种子,不设置的话是按照系统时间作参数,有随机种子可以保证我们每次运行结果是一样的

# 获取鸢尾花数据集
iris = datasets.load_iris()
# 特征数据
iris_datas = iris.data
# 标签数据
iris_targets = iris.target
# 标签名称
iris_names = iris.target_names

# 查看特征数据数量
print("查看特征数据数量:", len(iris_datas))
# 查看标签名称
print("查看标签名称:", iris_names)

# 从150条数据中选择140条作为训练集,10条作为测试集。

# permutation方法接收一个数作为参数【这里我就直接使用特征数据的数量】,产生一个0-149乱序的一维数组
randomArr = np.random.permutation(len(iris_datas))
# 切割出训练集的特征数据 0~倒数第10个截止,也就是切割140个
iris_train_datas = iris_datas[randomArr[:-10]]
# 切割出训练集标签数据
iris_train_target = iris_targets[randomArr[:-10]]

# 切割出测试集的特征数据 倒数第十个开始 往后获取全部,也就是最后10个数据
iris_test_datas = iris_datas[randomArr[-10:]]
# 切割出测试集的标签数据
iris_test_target = iris_targets[randomArr[-10:]]


# 用Sklearn训练好的KNN模型 定义一个KNN分类器 在这里我们设置超参数K值为5
knn = KNeighborsClassifier(5)

# 调用knn对象的训练方法,主要接收两个参数,训练数据集和训练标签集
knn.fit(iris_train_datas, iris_train_target)

# 调用预测方法,主要接收一个参数 测试数据集
iris_test_predict = knn.predict(iris_test_datas)
# 计算各测试样本的预测概率值,这里我没有用概率值,但是在实际工作中可能会参考概率值进行最后的结果筛选,而不是直接使用给出的标签
#property = knn.predict_proba(iris_test_datas)
#print(property)

# 通过输入测试数据和测试标签,计算出模型准确率
score = knn.score(iris_test_datas,iris_test_target,sample_weight=None)

# 输出测试结果
print("该模型测试评估:", score)

# 输出模型评估标签和原始正确标签,方便比对
print("模型评估的标签:", iris_test_predict)
print("模型评估的标签:", iris_test_target)

图片.png

Мы видим, что модель точна на 90%, и из десяти тестовых данных будет только второе.ирис пестрыйоценка становитсяВирджиния Ирис

Заинтересованные партнеры также могут изменить гиперпараметр K в режиме реального времени, чтобы увидеть, как различные диапазоны гиперпараметров повлияют на прогноз модели.

# 用Sklearn训练好的KNN模型 定义一个KNN分类器 在这里我们设置超参数K值为5
knn = KNeighborsClassifier(5)