sklearnは、K最近傍アルゴリズム、アイリス分類、Facebookチェックイン位置予測を実装します

1 K最近傍アルゴリズム(KNN)の概念

KNNアルゴリズムフロー

sklearnのKNNアルゴリズムの実装

 

API:    sklearn.neighbors.KNeighborsClassifier(n_neighbors = 5、algorithm = 'auto')

パラメータの説明

  • n_neighbors:
    • int、オプション(デフォルト= 5)、k_neighborsはデフォルトで使用されるネイバーの数を照会します
  • アルゴリズム文字列型、オプションのパラメータは次のとおりです:「auto」、「ball_tree」、「kd_tree」、「brute」。その中で:
    • デフォルトのパラメータはautoです。これは、アルゴリズムが適切な検索アルゴリズムを自動的に決定するためです。さらに、ユーザーは独自の検索アルゴリズムball_tree、kd_tree、検索する野蛮なメソッドを指定することもできます。
    • ブルートはブルートフォース検索、つまり線形スキャンです。トレーニングセットが大きい場合、計算には非常に時間がかかります。
    • kd_treeは、データを格納してすばやく取得できるようにkdツリーを構築するツリーデータ構造です。kdツリーは、データ構造内のバイナリツリーでもあります。中央値セグメンテーションによって構築されたツリー。各ノードはスーパー長方形であり、次元が20未満の場合に効率が高くなります。
    • ボールツリーは、kdツリーの高次元の失敗を克服するために発明されました。その構築プロセスは、サンプル空間を重心Cと半径rで分割することであり、各ノードは超球です。
from sklearn.neighbors import KNeighborsClassifier
import pickle


# 训练集 x是特征值,y是标签
x = [[0], [1], [2], [10], [15], [11]]
y = [0, 0, 0, 1, 1, 1]

# 实例化一个knn对象,k=3
estimator = KNeighborsClassifier(n_neighbors=3, algorithm='auto')
# 训练
estimator.fit(x,y)

# 预测 
estimator.predict([[22]])

# 模型保存
with open('./KNN.pkl','wb') as f:
    pickle.dump(estimator, f)

モデルの読み込み

import pickle


# 模型加载
with open('./KNN.pkl', 'rb') as ff:
    model = pickle.load(ff)

# 模型预测
model.predict([[15]])

2KNNに基づく虹彩分類

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier


# 数据集加载
iris= load_iris()

# 数据集划分
x_train,x_test, y_train,y_test = train_test_split(iris.data, iris.target, test_size=0.2)

#特征工程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 机器学习
estimator = KNeighborsClassifier(n_neighbors=11, algorithm='auto')
estimator.fit(x_train, y_train)

# 预测
y_predict = estimator.predict(x_test)
print("测试集预测结果:\n", y_predict)
print()
print(y_predict == y_test)

# 计算模型得分
score = estimator.score(x_test,y_test)
print("模型得分为:", score)

3Facebookのサインイン場所の予測

 

import pandas as pd
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import numpy as np


# 1、获取数据集
facebook = pd.read_csv("./train.csv")

# 2.基本数据处理
# 2.1 缩小数据范围
facebook_data = facebook.query("x>2.0 & x<2.5 & y>2.0 & y<2.5")
# 2.2 选择时间特征
time = pd.to_datetime(facebook_data["time"], unit="s")
time = pd.DatetimeIndex(time)
facebook_data["day"] = time.day
facebook_data["hour"] = time.hour
facebook_data["weekday"] = time.weekday
# 2.3 去掉签到较少的地方
place_count = facebook_data.groupby("place_id").count()
place_count = place_count[place_count["row_id"]>3]
facebook_data = facebook_data[facebook_data["place_id"].isin(place_count.index)]
# 2.4 确定特征值和目标值
x = facebook_data[["x", "y", "accuracy", "day", "hour", "weekday"]]
y = facebook_data["place_id"]
# 2.5 分割数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)

# 3.特征工程--特征预处理(标准化)
# 3.1 实例化一个转换器
transfer = StandardScaler()
# 3.2 调用fit_transform
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 4.机器学习--knn+cv
# 4.1 实例化一个估计器
estimator = KNeighborsClassifier()
# 4.2 调用gridsearchCV
param_grid = {"n_neighbors": [1, 3, 5, 7, 9]}
estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5)
# 4.3 模型训练
estimator.fit(x_train, y_train)

# 5.模型评估
# 5.1 基本评估方式
score = estimator.score(x_test, y_test)
print("最后预测的准确率为:\n", score)

y_predict = estimator.predict(x_test)
print("最后的预测值为:\n", y_predict)
print("预测值和真实值的对比情况:\n", y_predict == y_test)

# 5.2 使用交叉验证后的评估方式
print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)
print("每次交叉验证后的验证集准确率结果和训练集准确率结果:\n",estimator.cv_results_)

トレーニングデータセットは少し大きいので、ネットワークディスクリンクに配置します:https://pan.baidu.com/s/1IqeYKknJnxeTa9wieSTh7w抽出コード:1111 

KNNアルゴリズムの要約

  • 利点:

    • シンプルで効果的
    • 再訓練の低コスト
    • クロスドメインサンプルに適しています
      • KNN法は、クラスドメインを識別してカテゴリを決定する方法ではなく、主に周囲の限られた近くのサンプルに依存します。したがって、サンプルセットをクラスドメインのより多くのクロスまたはオーバーラップで分割するには、KNN法の方が適しています。他の方法より。
    • 大きなサンプルの自動分類に適しています
      • このアルゴリズムはサンプルサイズが比較的大きいクラスドメインの自動分類に適しています。サンプルサイズが小さいドメインは、このアルゴリズムを使用すると誤分類されやすくなります

  • 短所:

    • 怠惰な学習

      • KNNアルゴリズムは怠惰な学習方法(怠惰な学習、基本的には学習しません)であり、一部のアクティブラーニングアルゴリズムははるかに高速です
    • カテゴリの評価は正規化されていません

      • 確率スコアを渡すいくつかの分類とは異なり
    • 出力はあまり解釈できません
      • たとえば、デシジョンツリーの出力はより解釈しやすくなります
    • 不均一なサンプルは得意ではありません
      • たとえば、あるクラスのサンプルサイズが非常に大きく、他のクラスのサンプルサイズが非常に小さいなど、サンプルが不均衡な場合、新しいサンプルを入力すると、大容量クラスのサンプルがサンプルのK近傍が大部分を占めています。アルゴリズムは「最近傍」サンプルのみを計算します。特定のタイプのサンプル数が多い場合、そのようなサンプルはターゲットサンプルに近くないか、そのようなサンプルはターゲットサンプルに非常に近くなります。いずれの場合も、数量は操作の結果に影響しません。重み法を使用することで改善できます(サンプルからの距離が小さい隣人は重みが大きくなります)。
    • 大量の計算
      • 現在、一般的に使用されている解決策は、既知のサンプルポイントを事前に編集し、分類にほとんど影響を与えないサンプルを事前に削除することです。

 

おすすめ

転載: blog.csdn.net/qq_39197555/article/details/114992113