1. 特徴の前処理
特徴量エンジニアリングの目的:データを機械が認識しやすいデータに変換すること
scikit-learn:生の特徴ベクトルを下流の推定器により適した表現に変更するための、いくつかの一般的なユーティリティ関数とトランスフォーマー クラスを提供します。つまり、いくつかの変換関数を通じて、特徴データは特徴データ プロセスに変換されます。
特徴量の単位やサイズが大きく異なる、または特徴量の分散が他の特徴量よりも数桁大きいため、ターゲットの結果に影響(支配)を与えやすく、一部のアルゴリズムが他の特徴量を学習できなくなるため、正規化/標準化が必要です
正規化や標準化など、異なる仕様のデータを同じ仕様に変換できるように、無次元変換にはいくつかのメソッドを使用する必要があります。
第二に、正規化
正規化:元のデータを変換してデータを (デフォルト [0,1]) にマッピングします。
式は次のとおりです
各列に作用します。max は列の最大値、min は列の最小値、X'' は最終結果、mx、mi はそれぞれ指定された間隔値です。デフォルトでは、mx は 1、mi は 0、例は次のとおりです。
API関数は以下のように使用します。
- sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)…): feature_range は範囲を指定します
- MinMaxScalar.fit_transform(X)
- X: numpy 配列形式のデータ [n_samples, n_features]
- 戻り値:変換後の同じ形状の配列
- MinMaxScalar.fit_transform(X)
コードは次のとおりです。ヘレンのデート データの date.txt ファイルは、ネットワーク ディスク リンクの記事の最後にあります。
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
data = pd.read_csv("../data/dating.txt")
print(data)
transfer = MinMaxScaler(feature_range=(0, 1)) # 实例化一个转换器类
minmax_data = transfer.fit_transform(data[['milage', 'Liters', 'Consumtime']]) # 调用fit_transform
print("最小值最大值归一化处理后的结果:\n", minmax_data)
-------------------------------------------------------------
输出:
milage Liters Consumtime target
0 40920 8.326976 0.953952 3
1 14488 7.153469 1.673904 2
2 26052 1.441871 0.805124 1
3 75136 13.147394 0.428964 1
4 38344 1.669788 0.134296 1
.. ... ... ... ...
995 11145 3.410627 0.631838 2
996 68846 9.974715 0.669787 1
997 26575 10.650102 0.866627 3
998 48111 9.134528 0.728045 3
999 43757 7.882601 1.332446 3
[1000 rows x 4 columns]
最小值最大值归一化处理后的结果:
[[0.44832535 0.39805139 0.56233353]
[0.15873259 0.34195467 0.98724416]
[0.28542943 0.06892523 0.47449629]
...
[0.29115949 0.50910294 0.51079493]
[0.52711097 0.43665451 0.4290048 ]
[0.47940793 0.3768091 0.78571804]]
最大値と最小値は変化し、外れ値の影響を受けやすいため、この方法は堅牢性が低く、従来の正確な小規模データのシナリオにのみ適しています。
3. 標準化
標準化:元のデータを変換することで、平均が0、標準偏差が1のデータに変換します。
式は次のとおりです
各列に作用します。mean は平均値、σ は標準偏差です。
- 正規化の場合:最大値と最小値に影響を与える外れ値がある場合、結果は明らかに変わります。
- 標準化の場合:一定量のデータにより外れ値がある場合、少数の外れ値は平均値にほとんど影響を与えないため、分散の変化は小さくなります。
APIは以下の通りです
- sklearn.preprocessing.StandardScaler( ):処理後、列ごとに、すべてのデータが平均 0 付近に収集され、標準偏差は 1 になります。
- StandardScaler.fit_transform(X)
- X: numpy 配列形式のデータ [n_samples, n_features]
- 戻り値:変換後の同じ形状の配列
- StandardScaler.fit_transform(X)
from sklearn.preprocessing import StandardScaler
import pandas as pd
data = pd.read_csv("../data/dating.txt")
print(data)
transfer = StandardScaler() # 实例化一个转换器
minmax_data = transfer.fit_transform(data[['milage', 'Liters', 'Consumtime']]) # 调用fit_transform
print("最小值最大值标准化处理后的结果:\n", minmax_data)
print("每一列特征的平均值:\n", transfer.mean_)
print("每一列特征的方差:\n", transfer.var_)
-------------------------------------------------------
输出:
milage Liters Consumtime target
0 40920 8.326976 0.953952 3
1 14488 7.153469 1.673904 2
2 26052 1.441871 0.805124 1
3 75136 13.147394 0.428964 1
4 38344 1.669788 0.134296 1
.. ... ... ... ...
995 11145 3.410627 0.631838 2
996 68846 9.974715 0.669787 1
997 26575 10.650102 0.866627 3
998 48111 9.134528 0.728045 3
999 43757 7.882601 1.332446 3
[1000 rows x 4 columns]
最小值最大值标准化处理后的结果:
[[ 0.33193158 0.41660188 0.24523407]
[-0.87247784 0.13992897 1.69385734]
[-0.34554872 -1.20667094 -0.05422437]
...
[-0.32171752 0.96431572 0.06952649]
[ 0.65959911 0.60699509 -0.20931587]
[ 0.46120328 0.31183342 1.00680598]]
每一列特征的平均值:
[3.36354210e+04 6.55996083e+00 8.32072997e-01]
每一列特征的方差:
[4.81628039e+08 1.79902874e+01 2.46999554e-01]
十分なサンプルがある場合、標準化は比較的安定しており、ビッグデータのシナリオに適しています。
4. アヤメの種類の予測
最近傍アルゴリズム API
- sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
- n_neighbors : int、オプション (デフォルト = 5)、k_neighbors クエリにデフォルトで使用する近傍の数
- アルゴリズム: {'auto', 'ball_tree', 'kd_tree', 'brute'}: 高速な k 最近傍検索アルゴリズム。デフォルトのパラメーターはauto です。これは、アルゴリズムが適切な検索アルゴリズムを独自に決定するため理解できます。さらに、ユーザーは次の検索アルゴリズムを指定して検索することもできます。
- ボール ツリー: kd ツリーの高緯度障害を克服するために発明され、その構築プロセスではサンプル空間が重心 C と半径 r で分割され、各ノードは超球になります。
- kd_tree:高速取得のためにデータを保存する kd ツリーを構築するツリー データ構造。kd ツリーはデータ構造内のバイナリ ツリーでもあります。中央値セグメンテーションによって構築されたツリーは、各ノードが超長方形であり、次元が 20 未満の場合に効率的です。
- Brute:総当たり検索、つまり線形スキャンです。トレーニング セットが大きい場合、計算に非常に時間がかかります。
アヤメデータセット
- インスタンス数: 150 (3 つのクラスごとに 50)
- 属性の数: 4 (予測に役立つ数値、数値、属性およびクラス)
- 属性、特徴量
- がく片の長さ:がく片の長さ(cm)
- がく片の幅:がく片の幅 (cm)
- 花びらの長さ: 花びらの長さ (cm)
- 花びらの幅: 花びらの幅 (cm)
- 種類、目標値
- アイリスセトサ: ヤマアイリス
- Iris-Versicolour: バリエーション アイリス
- アイリス-バージニカ: バージニア アイリス
コードは以下のように表示されます
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier # 导入模块
# 1.获取数据集
iris = load_iris()
# 2.数据基本处理
# x_train,x_test,y_train,y_test为训练集特征值、测试集特征值、训练集目标值、测试集目标值
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22) # 划分数据集
# 3.特征工程:标准化
transfer = StandardScaler() # 实例化转换器
x_train = transfer.fit_transform(x_train) # 调用方法,标准化
x_test = transfer.transform(x_test)
# 4.机器学习(模型训练)
estimator = KNeighborsClassifier(n_neighbors=2) # 实例化一个估计器,n_neighbors为选定参考的邻居数
estimator.fit(x_train, y_train) # 模型训练
# 5.模型评估
# 方法1:比对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:", y_predict)
print("比对真实值和预测值:", y_predict == y_test)
# 方法2:直接计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:", score)
-----------------------------------------------
输出:
预测结果为: [0 2 1 2 1 1 1 2 1 0 2 1 2 2 0 2 1 1 1 1 0 2 0 1 2 0 2 2 2 2]
比对真实值和预测值: [ True True True True True True True True True True True True
True True True True True True False True True True True True
True True True True True True]
准确率为: 0.9666666666666667
ヘレンのデート データデート.txt をダウンロード: https://pan.baidu.com/s/1JFrp-3YQyH_zFBwWulNqmQ?pwd=68ww
ナビゲーションの学習: http://xqnav.top/