機械学習の基礎「特徴量エンジニアリング (3) - 特徴量の前処理」

1. 特徴前処理とは何ですか?

いくつかの変換関数を通じて特徴データをアルゴリズムモデルにより適した特徴データに変換するプロセス

処理前の特徴量は数値ですが、処理後に特徴量のスケーリングが行われます。

1. 内容:
数値データの無次元変換:
正規化と
標準化

2. 機能前処理 API
sklearn.preprocessing


3. 特徴量を正規化/標準化する必要があるのはなぜですか? 特徴量の単位やサイズが大きく異なっていたり、特徴量の分散が他の特徴量よりも数桁大きかったりするため、ターゲットの結果に簡単に影響 (支配) する可能性があります
多くのデータ次元が一貫していないため、一部のアルゴリズムは他の機能を学習できません

走行距離の値が比較的大きく、消費時間が比較的小さいことがわかります。KNN
アルゴリズムを使用してユークリッド距離の式を計算すると、最終結果は走行距離によって支配され、他の特徴は学習できません
(72993 ~ 35948) ) ^ 2 + (10.14 - 6.83 ) ^ 2 + (1.03 - 1.21) ^ 2

異なる仕様のデータを同じ仕様に変換するには、無次元変換のためのいくつかのメソッドを使用する必要があります。

4. ユークリッド距離の公式とは何ですか?

5. 無次元処理 無
次元処理が必要な理由は、寸法が統一されていないため、走行距離が非常に大きくなるからです。機能を同等に重要にするためには、正規化/標準化が必要です

2. 正規化

1. 定義:
元のデータを変換して、データを間 (デフォルトは [0,1]) にマッピングします。

2、公式

3、API関数数
sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1)...)

4.
MinMaxScaler.fit_transform
( X
)

5.dating.txtのデータを正規化する

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler
import jieba
import pandas as pd

def datasets_demo():
    """
    sklearn数据集使用
    """
    #获取数据集
    iris = load_iris()
    print("鸢尾花数据集:\n", iris)
    print("查看数据集描述:\n", iris["DESCR"])
    print("查看特征值的名字:\n", iris.feature_names)
    print("查看特征值几行几列:\n", iris.data.shape)
   
    #数据集的划分
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
    print("训练集的特征值:\n", x_train, x_train.shape)

    return None
 
def dict_demo():
    """
    字典特征抽取
    """
    data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
    # 1、实例化一个转换器类
    transfer = DictVectorizer(sparse=False)

    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    print("特征名字:\n", transfer.get_feature_names())

    return None

def count_demo():
    """
    文本特征抽取
    """
    data = ["life is short,i like like python", "life is too long,i dislike python"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names()) 

    return None

def count_chinese_demo():
    """
    中文文本特征抽取
    """
    data = ["我 爱 北京 天安门", "天安门 上 太阳 升"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray());
    print("特征名字:\n", transfer.get_feature_names())
    
    return None

def cut_word(text):
    """
    进行中文分词
    """
    return " ".join(list(jieba.cut(text)))  #返回一个分词生成器对象,强转成list,再join转成字符串

def count_chinese_demo2():
    """
    中文文本特征抽取,自动分词
    """
    # 1、将中文文本进行分词
    data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
        "我们看到的从很远星系来的光是在几百万年前之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
        "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    print(data_new)
    # 2、实例化一个转换器类
    transfer = CountVectorizer()
    # 3、调用fit_transform()
    data_final = transfer.fit_transform(data_new)
    print("data_final:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    return None

def tfidf_demo():
    """
    用tf-idf的方法进行文本特征抽取
    """
    # 1、将中文文本进行分词
    data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
        "我们看到的从很远星系来的光是在几百万年前之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
        "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    print(data_new)
    # 2、实例化一个转换器类
    transfer = TfidfVectorizer()
    # 3、调用fit_transform()
    data_final = transfer.fit_transform(data_new)
    print("data_final:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    return None

def minmax_demo():
    """
    归一化
    """
    # 1、获取数据
    data = pd.read_csv("dating.txt")
    #print("data:\n", data)
    data = data.iloc[:, 0:3] #行都要,列取前3列
    print("data:\n", data)
    # 2、实例化一个转换器
    transfer = MinMaxScaler()
    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    return None

if __name__ == "__main__":
    # 代码1:sklearn数据集使用
    #datasets_demo()
    # 代码2:字典特征抽取
    #dict_demo()
    # 代码3:文本特征抽取
    #count_demo()
    # 代码4:中文文本特征抽取
    #count_chinese_demo()
    # 代码5:中文文本特征抽取,自动分词
    #count_chinese_demo2()
    # 代码6: 测试jieba库中文分词
    #print(cut_word("我爱北京天安门"))
    # 代码7:用tf-idf的方法进行文本特征抽取
    #tfidf_demo()
    # 代码8:归一化
    minmax_demo()

操作結果:

data:
      milage     liters  consumtime
0     40920   8.326976    0.953952
1     14488   7.153469    1.673904
2     26052   1.441871    0.805124
3     75136  13.147394    0.428964
4     38344   1.669788    0.134296
..      ...        ...         ...
984   11145   3.410627    0.631838
985   68846   9.974715    0.669787
986   26575  10.650102    0.866627
987   48111   9.134528    0.728045
988   43757   7.882601    1.332446

[989 rows x 3 columns]
data_new:
 [[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. 標準化

1. 正規化のデメリットは何ですか?
正規化結果は最小値と最大値に基づいて計算されますが、データに外れ値が多い場合、最大値と最小値は外れ値の影響を非常に受けやすいため、この方法
は堅牢性 (堅牢性) が低く、従来の正確な小規模データのシナリオにのみ適しています

2. 定義:
元のデータを平均 0、標準偏差 1 の範囲に変換します。

3、公式

データから列の平均を引き、標準偏差で割ります。

4. 標準偏差とは何ですか?

5. API 関数
sklearn.preprocessing.StandardScaler()による処理後
、列ごとに、すべてのデータが平均 0 および標準偏差 1 の周囲にクラスター化されます。

6. StandardScaler.fit_transform(X)
X: numpy 配列形式のデータ [n_samples, n_features]
戻り値: 変換後の同じ形状の配列

7.dating.txtのデータを標準化する

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import jieba
import pandas as pd

def datasets_demo():
    """
    sklearn数据集使用
    """
    #获取数据集
    iris = load_iris()
    print("鸢尾花数据集:\n", iris)
    print("查看数据集描述:\n", iris["DESCR"])
    print("查看特征值的名字:\n", iris.feature_names)
    print("查看特征值几行几列:\n", iris.data.shape)
   
    #数据集的划分
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
    print("训练集的特征值:\n", x_train, x_train.shape)

    return None
 
def dict_demo():
    """
    字典特征抽取
    """
    data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
    # 1、实例化一个转换器类
    transfer = DictVectorizer(sparse=False)

    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    print("特征名字:\n", transfer.get_feature_names())

    return None

def count_demo():
    """
    文本特征抽取
    """
    data = ["life is short,i like like python", "life is too long,i dislike python"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names()) 

    return None

def count_chinese_demo():
    """
    中文文本特征抽取
    """
    data = ["我 爱 北京 天安门", "天安门 上 太阳 升"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray());
    print("特征名字:\n", transfer.get_feature_names())
    
    return None

def cut_word(text):
    """
    进行中文分词
    """
    return " ".join(list(jieba.cut(text)))  #返回一个分词生成器对象,强转成list,再join转成字符串

def count_chinese_demo2():
    """
    中文文本特征抽取,自动分词
    """
    # 1、将中文文本进行分词
    data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
        "我们看到的从很远星系来的光是在几百万年前之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
        "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    print(data_new)
    # 2、实例化一个转换器类
    transfer = CountVectorizer()
    # 3、调用fit_transform()
    data_final = transfer.fit_transform(data_new)
    print("data_final:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    return None

def tfidf_demo():
    """
    用tf-idf的方法进行文本特征抽取
    """
    # 1、将中文文本进行分词
    data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
        "我们看到的从很远星系来的光是在几百万年前之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
        "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    print(data_new)
    # 2、实例化一个转换器类
    transfer = TfidfVectorizer()
    # 3、调用fit_transform()
    data_final = transfer.fit_transform(data_new)
    print("data_final:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    return None

def minmax_demo():
    """
    归一化
    """
    # 1、获取数据
    data = pd.read_csv("dating.txt")
    #print("data:\n", data)
    data = data.iloc[:, 0:3] #行都要,列取前3列
    print("data:\n", data)
    # 2、实例化一个转换器
    transfer = MinMaxScaler()
    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    return None

def stand_demo():
    """
    标准化
    """
    # 1、获取数据
    data = pd.read_csv("dating.txt")
    #print("data:\n", data)
    data = data.iloc[:, 0:3] #行都要,列取前3列
    print("data:\n", data)
    # 2、实例化一个转换器
    transfer = StandardScaler()
    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    return None

if __name__ == "__main__":
    # 代码1:sklearn数据集使用
    #datasets_demo()
    # 代码2:字典特征抽取
    #dict_demo()
    # 代码3:文本特征抽取
    #count_demo()
    # 代码4:中文文本特征抽取
    #count_chinese_demo()
    # 代码5:中文文本特征抽取,自动分词
    #count_chinese_demo2()
    # 代码6: 测试jieba库中文分词
    #print(cut_word("我爱北京天安门"))
    # 代码7:用tf-idf的方法进行文本特征抽取
    #tfidf_demo()
    # 代码8:归一化
    #minmax_demo()
    # 代码9:标准化
    stand_demo()

操作結果:

data:
      milage     liters  consumtime
0     40920   8.326976    0.953952
1     14488   7.153469    1.673904
2     26052   1.441871    0.805124
3     75136  13.147394    0.428964
4     38344   1.669788    0.134296
..      ...        ...         ...
984   11145   3.410627    0.631838
985   68846   9.974715    0.669787
986   26575  10.650102    0.866627
987   48111   9.134528    0.728045
988   43757   7.882601    1.332446

[989 rows x 3 columns]
data_new:
 [[ 0.33984938  0.42024644  0.2460588 ]
 [-0.86581884  0.14356328  1.69344575]
 [-0.338339   -1.2030865  -0.05314407]
 ...
 [-0.31448289  0.96798056  0.07050117]
 [ 0.66785937  0.61064669 -0.2081032 ]
 [ 0.46925618  0.31547409  1.00698075]]

8. 標準化の概要:
十分なサンプルがある場合は比較的安定しており、ノイズの多い最新のビッグ データ シナリオに適しています。
 

おすすめ

転載: blog.csdn.net/csj50/article/details/132108346
おすすめ