TECH I.S.

事前処理 - カテゴリーデータ

カテゴリーデータ

データに文字列で表されるカテゴリがある場合、数値データのみを受け入れることが多い機械学習モデルをトレーニングするためにそれらを使用することは困難です。

カテゴリーデータを無視してモデルから情報を除外する代わりに、モデルで使用できるようにデータを変換できます。

下の表を見てください。これは、重回帰の章

import pandas as pd cars = pd.read_csv('data.csv') print(cars.to_string())

結果

車種 体積 重量 CO2
0 トヨティ アイゴ 1000 790 99
1 三菱 スペーススター 1200 1160 95
2 シュコダ シティゴ 1000 929 95
3 フィアット 500 900 865 90
4 ミニクーパー 1500 1140 105
5 VWアップ! 1000 929 105
6 シュコダ ファビア 1400 1109 90
7 メルセデス A クラス 1500 1365 92
8 フォード フィエスタ 1500 1112 98
9 アウディ A1 1600 1150 99
10 現代 I20 1100 980 99
11 スズキ スイフト 1300 990 101
12 フォード フィエスタ 1000 1112 99
13 ホンダ シビック 1600 1252 94
14 フンダイ I30 1600 1326 97
15 オペル アストラ 1600 1330 97
16 BMW 1 1600 1365 99
17 マツダ 3 2200 1280 104
18 シュコダ ラピッド 1600 1119 104
19 フォード フォーカス 2000 1328 105
20 フォード モンデオ 1600 1584 94
21 オペル インシグニア 2000 1428 99
22 メルセデス C クラス 2100 1365 99
23 シュコダ オクタビア 1600 1415 99
24 ボルボ S60 2000 1415 99
25 メルセデス CLA 1500 1465 102
26 アウディ A4 2000 1490 104
27 アウディ A6 2000 1725 114
28 ボルボ V70 1600 1523 109
29 BMW 5 2000 1705 114
30 メルセデス E クラス 2100 1605 115
31 ボルボ XC70 2000 1746 117
32 フォード B-マックス 1600 1235 104
33 BMW 216 1600 1390 108
34 オペル ザフィーラ 1600 1405 109
35 メルセデス SLK 2500 1395 120

実行例(開発準備中) »

重回帰の章では、エンジンの容積と車の重量に基づいて CO2 排出量を予測しようとしましたが、車のブランドとモデルに関する情報は除外しました。

自動車のブランドやモデルに関する情報は、排出される CO2 をより正確に予測するのに役立つ可能性があります。


ワンホットエンコーディング

Car または Model 列は数値ではないため、データで使用することはできません。カテゴリ変数 Car または Model と数値変数 CO2 の間の線形関係は決定できません。

この問題を解決するには、カテゴリ変数の数値表現が必要です。これを行う 1 つの方法は、カテゴリ内の各グループを表す列を作成することです。

各列の値は 1 または 0 で、1 はグループの包含を表し、0 は除外を表します。この変換はワンホットエンコーディングと呼ばれます。

これを手動で行う必要はありません。Python Pandas モジュールには、get_dummies()1 つのホット エンコーディングを行います。

Pandas モジュールについては、pandasのチュートリアル

Car 列を 1 つのホットエンコードします。

import pandas as pd cars = pd.read_csv('data.csv') ohe_cars = pd.get_dummies(cars[['Car']]) print(ohe_cars.to_string())

結果

Car_Audi Car_BMW Car_Fiat Car_Ford Car_Honda Car_Hundai Car_Hyundai Car_Mazda Car_Mercedes Car_Mini Car_Mitsubishi Car_Opel Car_Skoda Car_Suzuki Car_Toyoty Car_VW Car_Volvo
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0 0 0 0 0 1 0
6 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
7 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
8 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
9 1 0 0 0 0 0 0 0 0 0 0 0 0 0
10 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
11 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
12 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
13 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
14 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
15 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
16 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
17 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
18 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
19 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
20 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
21 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
22 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
23 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
24 0 0 0 0 0 0 0 0 0 0 0 0 0 1
25 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
26 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
27 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
28 0 0 0 0 0 0 0 0 0 0 0 0 0 1
29 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
30 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
31 0 0 0 0 0 0 0 0 0 0 0 0 0 1
32 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
33 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
34 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
35 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0

実行例(開発準備中) »

結果

Car 列の車のブランドごとに 1 つの列が作成されました。


CO2 を予測する

この追加情報を体積と重量とともに使用して、CO2 を予測できます。

情報を組み合わせるには、concat()pandasの関数。

まず、いくつかのモジュールをインポートする必要があります。

pandasのインポートから始めます。

import pandas

pandas モジュールを使用すると、csv ファイルを読み取り、DataFrame オブジェクトを操作できます。

cars = pandas.read_csv("data.csv")

また、ダミー変数を作成することもできます。

ohe_cars = pandas.get_dummies(cars[['Car']])

次に、独立変数 (X) を選択し、ダミー変数を列ごとに追加する必要があります。

従属変数も y に格納します。

X = pandas.concat([cars[['Volume', 'Weight']], ohe_cars], axis=1)y = cars['CO2']

また、線形モデルを作成するために sklearn からメソッドをインポートする必要があります

線形回帰について学ぶ

from sklearn import linear_model

これで、データを線形回帰に適合させることができます。

regr = linear_model.LinearRegression()regr.fit(X,y)

最後に、自動車の重量、容積、メーカーに基づいて CO2 排出量を予測できます。

##predict the CO2 emission of a Volvo where the weight is 2300kg, and the volume is 1300cm3:predictedCO2 = regr.predict([[2300, 1300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]])

import pandas from sklearn import linear_model cars = pandas.read_csv("data.csv") ohe_cars = pandas.get_dummies(cars[['Car']]) X = pandas.concat([cars[['Volume', 'Weight']], ohe_cars], axis=1) y = cars['CO2'] regr = linear_model.LinearRegression() regr.fit(X,y) ##predict the CO2 emission of a Volvo where the weight is 2300kg, and the volume is 1300cm3: predictedCO2 = regr.predict([[2300, 1300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]]) print(predictedCO2)

結果

[122.45153299]

実行例(開発準備中) »

これで、データ セット内の体積、重量、および各自動車ブランドの係数が得られました。


ダミー化

カテゴリ内のグループごとに 1 つの列を作成する必要はありません。グループ数よりも 1 列少ない情報を保持できます。

たとえば、色を表す列があり、その列に赤と青の 2 つの色があるとします。

import pandas as pd colors = pd.DataFrame({'color': ['blue', 'red']}) print(colors)

結果


0 青
赤1個

実行例(開発準備中) »

red という名前の 1 つの列を作成できます。1 は赤を表し、0 は赤ではない、つまり青を表します。

これを行うには、1 つのホット エンコーディングで使用したのと同じ関数 get_dummies を使用して、列の 1 つを削除します。結果のテーブルから最初の列を除外できる引数 drop_first があります。

import pandas as pd colors = pd.DataFrame({'color': ['blue', 'red']}) dummies = pd.get_dummies(colors, drop_first=True) print(dummies)

結果

赤色
0 0
1 1

実行例(開発準備中) »

2 つ以上のグループがある場合はどうなりますか?複数のグループを 1 つ少ない列で表すにはどうすればよいですか?

今回は、赤、青、緑の 3 色があるとします。最初の列をドロップしながら get_dummies を実行すると、次の表が得られます。

import pandas as pd colors = pd.DataFrame({'color': ['blue', 'red', 'green']}) dummies = pd.get_dummies(colors, drop_first=True) dummies['color'] = colors['color'] print(dummies)

結果

color_green color_red color
0 0 0 青
1 0 1 赤
2 1 0 緑

実行例(開発準備中) »



プログラミング学習を加速させる

プログラミングをプロの講師に教えてもらいませんか。

テックアイエスのプログラミングスクールは初心者も大歓迎です。年齢制限もありません。転職・副業に強く、挫折させない手厚いサポートで稼ぐ力を身につけましょう!

スクールの詳細