# 教師データ
x = [[5], [10], [20], [22], [25]]
y = ["買わない", "買わない", "買う", "買わない", "買う"]
# 学習の実行
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(x, y)
KNeighborsClassifier()
# 新データを用いた分類
knn.predict([[30]])
array(['買わない'], dtype='<U4')
# 分類の判定精度
knn.score(x, y)
0.6
# 教師データ(正解)と予測値の比較
print("実際のデータ=", y)
print("分類結果のデータ=", knn.predict(x))
実際のデータ= ['買わない', '買わない', '買う', '買わない', '買う'] 分類結果のデータ= ['買わない' '買わない' '買わない' '買わない' '買わない']
# ハイパーパラメータの確認
print(knn.n_neighbors)
5
# ハイパーパラメータの変更と精度確認
knn.n_neighbors = 4
knn.fit(x, y)
knn.score(x, y)
0.8
# 新データを用いた分類
knn.predict([[30]])
array(['買う'], dtype='<U4')
# 教師データの読み込み
import pandas as pd
url = 'https://www.ces-alpha.org/course/file_serve/5660558061731840/ice_sales.xlsx'
df = pd.read_excel(url)
df
temp | sales | |
---|---|---|
0 | 7.5 | 5.8 |
1 | 8.0 | 8.2 |
2 | 11.1 | 8.9 |
3 | 16.2 | 10.3 |
4 | 21.3 | 10.4 |
5 | 23.3 | 12.8 |
6 | 27.1 | 13.5 |
7 | 27.9 | 12.8 |
8 | 24.0 | 10.1 |
9 | 20.1 | 10.0 |
10 | 14.1 | 9.2 |
11 | 10.1 | 6.4 |
12 | 8.2 | 5.7 |
13 | 7.9 | 6.4 |
14 | 10.2 | 8.9 |
15 | 13.6 | 9.8 |
16 | 20.0 | 8.7 |
17 | 24.0 | 12.6 |
18 | 29.1 | 13.0 |
19 | 30.2 | 17.2 |
20 | 26.5 | 9.6 |
21 | 19.8 | 8.4 |
22 | 14.1 | 9.8 |
23 | 10.7 | 7.7 |
# 教師データのセット
x = df.temp.to_frame()
y = df.sales
# 回帰の学習実行
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x, y)
LinearRegression()
# 回帰による新データからの予測値計算(warningが出るが無視してよい)
lr.predict([[30]])
C:\Users\kumano\AppData\Local\Programs\Python\Python310\lib\site-packages\sklearn\base.py:450: UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names warnings.warn(
array([13.62120947])
# 回帰の精度
lr.score(x, y)
0.7261874233533445
# 実データ(教師データ)と予測値の比較
print("実際のデータ", df.sales.values)
print("予測データ", lr.predict(x))
実際のデータ [ 5.8 8.2 8.9 10.3 10.4 12.8 13.5 12.8 10.1 10. 9.2 6.4 5.7 6.4 8.9 9.8 8.7 12.6 13. 17.2 9.6 8.4 9.8 7.7] 予測データ [ 6.70272434 6.85646845 7.80968196 9.37787192 10.94606189 11.56103834 12.72949361 12.97548419 11.7762801 10.57707601 8.73214664 7.50219373 6.9179661 6.82571963 7.53294256 8.57840253 10.54632719 11.7762801 13.34447006 13.68270711 12.54500067 10.48482954 8.73214664 7.68668667]
import matplotlib.pyplot as plt
# 日本語表示用ライブラリ(matplotlibで日本語を使用したい場合)
import japanize_matplotlib
# グラフをinline表示可能にする
%matplotlib inline
# 解像度を上げてinline表示する
%config InlineBackend.figure_format = 'retina'
plt.scatter(df.temp, df.sales)
plt.plot(df.temp, lr.predict(x))
plt.xlabel("気温 (℃)", fontsize=20)
plt.ylabel("売上高 (万円)", fontsize=20);
# 予測に用いる回帰直線の式
print('sales = %.3ftemp + %.3f' % (lr.coef_, lr.intercept_))
sales = 0.307temp + 4.397
# 具体値を入れて回帰
0.307*30 + 4.397
13.607
# 教師データの読み込み
url = 'https://www.ces-alpha.org/course/file_serve/5758886137036800/population.xlsx'
df = pd.read_excel(url)
df
name | population | rate | |
---|---|---|---|
0 | Hokkaido | 525 | 1.24 |
1 | Aomori-ken | 125 | 1.38 |
2 | Iwate-ken | 123 | 1.35 |
3 | Miyagi-ken | 231 | 1.23 |
4 | Akita-ken | 97 | 1.33 |
5 | Yamagata-ken | 108 | 1.40 |
6 | Fukushima-ken | 185 | 1.47 |
7 | Ibaraki-ken | 286 | 1.39 |
8 | Tochigi-ken | 193 | 1.39 |
9 | Gumma-ken | 194 | 1.40 |
10 | Saitama-ken | 735 | 1.27 |
11 | Chiba-ken | 626 | 1.28 |
12 | Tokyo-to | 1392 | 1.15 |
13 | Kanagawa-ken | 920 | 1.28 |
14 | Niigata-ken | 222 | 1.38 |
15 | Toyama-ken | 104 | 1.53 |
16 | Ishikawa-ken | 114 | 1.46 |
17 | Fukui-ken | 77 | 1.56 |
18 | Yamanashi-ken | 81 | 1.44 |
19 | Nagano-ken | 205 | 1.57 |
20 | Gifu-ken | 199 | 1.45 |
21 | Shizuoka-ken | 364 | 1.44 |
22 | Aichi-ken | 755 | 1.45 |
23 | Mie-ken | 178 | 1.47 |
24 | Shiga-ken | 141 | 1.47 |
25 | Kyoto-fu | 258 | 1.25 |
26 | Osaka-fu | 881 | 1.31 |
27 | Hyogo-ken | 547 | 1.41 |
28 | Nara-ken | 133 | 1.31 |
29 | Wakayama-ken | 93 | 1.46 |
30 | Tottori-ken | 56 | 1.63 |
31 | Shimane-ken | 67 | 1.68 |
32 | Okayama-ken | 189 | 1.47 |
33 | Hiroshima-ken | 280 | 1.49 |
34 | Yamaguchi-ken | 136 | 1.56 |
35 | Tokushima-ken | 73 | 1.46 |
36 | Kagawa-ken | 96 | 1.59 |
37 | Ehime-ken | 134 | 1.46 |
38 | Kochi-ken | 70 | 1.47 |
39 | Fukuoka-ken | 510 | 1.44 |
40 | Saga-ken | 82 | 1.64 |
41 | Nagasaki-ken | 133 | 1.66 |
42 | Kumamoto-ken | 175 | 1.60 |
43 | Oita-ken | 114 | 1.53 |
44 | Miyazaki-ken | 107 | 1.73 |
45 | Kagoshima-ken | 160 | 1.63 |
46 | Okinawa-ken | 145 | 1.82 |
# クラスタリングの学習実行
from sklearn.cluster import KMeans
km = KMeans(n_clusters = 2)
km.fit(df.drop("name", axis = 1))
KMeans(n_clusters=2)
# クラスタリング結果(group)を表に追加
df["group"] = km.labels_
df
name | population | rate | group | |
---|---|---|---|---|
0 | Hokkaido | 525 | 1.24 | 0 |
1 | Aomori-ken | 125 | 1.38 | 1 |
2 | Iwate-ken | 123 | 1.35 | 1 |
3 | Miyagi-ken | 231 | 1.23 | 1 |
4 | Akita-ken | 97 | 1.33 | 1 |
5 | Yamagata-ken | 108 | 1.40 | 1 |
6 | Fukushima-ken | 185 | 1.47 | 1 |
7 | Ibaraki-ken | 286 | 1.39 | 1 |
8 | Tochigi-ken | 193 | 1.39 | 1 |
9 | Gumma-ken | 194 | 1.40 | 1 |
10 | Saitama-ken | 735 | 1.27 | 0 |
11 | Chiba-ken | 626 | 1.28 | 0 |
12 | Tokyo-to | 1392 | 1.15 | 0 |
13 | Kanagawa-ken | 920 | 1.28 | 0 |
14 | Niigata-ken | 222 | 1.38 | 1 |
15 | Toyama-ken | 104 | 1.53 | 1 |
16 | Ishikawa-ken | 114 | 1.46 | 1 |
17 | Fukui-ken | 77 | 1.56 | 1 |
18 | Yamanashi-ken | 81 | 1.44 | 1 |
19 | Nagano-ken | 205 | 1.57 | 1 |
20 | Gifu-ken | 199 | 1.45 | 1 |
21 | Shizuoka-ken | 364 | 1.44 | 1 |
22 | Aichi-ken | 755 | 1.45 | 0 |
23 | Mie-ken | 178 | 1.47 | 1 |
24 | Shiga-ken | 141 | 1.47 | 1 |
25 | Kyoto-fu | 258 | 1.25 | 1 |
26 | Osaka-fu | 881 | 1.31 | 0 |
27 | Hyogo-ken | 547 | 1.41 | 0 |
28 | Nara-ken | 133 | 1.31 | 1 |
29 | Wakayama-ken | 93 | 1.46 | 1 |
30 | Tottori-ken | 56 | 1.63 | 1 |
31 | Shimane-ken | 67 | 1.68 | 1 |
32 | Okayama-ken | 189 | 1.47 | 1 |
33 | Hiroshima-ken | 280 | 1.49 | 1 |
34 | Yamaguchi-ken | 136 | 1.56 | 1 |
35 | Tokushima-ken | 73 | 1.46 | 1 |
36 | Kagawa-ken | 96 | 1.59 | 1 |
37 | Ehime-ken | 134 | 1.46 | 1 |
38 | Kochi-ken | 70 | 1.47 | 1 |
39 | Fukuoka-ken | 510 | 1.44 | 0 |
40 | Saga-ken | 82 | 1.64 | 1 |
41 | Nagasaki-ken | 133 | 1.66 | 1 |
42 | Kumamoto-ken | 175 | 1.60 | 1 |
43 | Oita-ken | 114 | 1.53 | 1 |
44 | Miyazaki-ken | 107 | 1.73 | 1 |
45 | Kagoshima-ken | 160 | 1.63 | 1 |
46 | Okinawa-ken | 145 | 1.82 | 1 |
# クラスタリング結果の可視化
import matplotlib.pyplot as plt
x = df.population
y = df.rate
plt.rcParams["figure.figsize"] = (10, 10)
df["color"] = df.group.map({0:"blue", 1:"red"})
plt.scatter(x, y, c=df.color)
plt.xlabel("人口 (万人)", fontsize=20)
plt.ylabel("出生率", fontsize=20)
for i in range(len(x)):
plt.text(x[i], y[i], df.name[i], fontsize=16)
# ハイパーパラメータ(クラスタ数)の変更と再学習
df = pd.read_excel(url)
km = KMeans(n_clusters = 3)
km.fit(df.drop("name", axis = 1))
KMeans(n_clusters=3)
# クラスタリング結果(group)を表に追加
df["group"] = km.labels_
df.head()
name | population | rate | group | |
---|---|---|---|---|
0 | Hokkaido | 525 | 1.24 | 2 |
1 | Aomori-ken | 125 | 1.38 | 1 |
2 | Iwate-ken | 123 | 1.35 | 1 |
3 | Miyagi-ken | 231 | 1.23 | 1 |
4 | Akita-ken | 97 | 1.33 | 1 |
# クラスタリング結果の再可視化
x = df.population
y = df.rate
plt.rcParams["figure.figsize"] = (10, 10)
df["color"] = df.group.map({0:"blue", 1:"red", 2:"green"})
plt.scatter(x, y, c=df.color)
plt.xlabel("人口 (万人)", fontsize=20)
plt.ylabel("出生率", fontsize=20)
for i in range(len(x)):
plt.text(x[i], y[i], df.name[i], fontsize=16)