0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

とりあえず一回やってみる機械学習

Posted at

教師あり

正解を与えた状態で学習をする
正解の特徴/パターンを見出し、できるだけ正確な予測ができるようなモデルを作成する。
代表的なのは「回帰」「分類」

「回帰」は連続値を推測する。
「分類」は所属カテゴリ(〇〇かどうか)を推測する

回帰

値を予測する際に使用する。

単回帰

サンプルコード
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(x_train, y_train) #最小二乗法を使って切片と係数を求める
y_pred = regressor.predict(x_test)

#可視化
plt.scatter(x_test, y_test, color='red')
plt.plot(x_test.values, y_pred, color='blue')
xの値からyの予測値を直線で考える方法。 残差をできるだけ小さくしていい感じの直線を引く

image.png

重回帰

サンプルコード(単回帰と実装は同じ)
#単回帰と実装は同じ
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(x_train, y_train) #最小二乗法を使って切片と係数を求める
y_pred = regressor.predict(x_test)

単回帰の次元が増えた版。(=説明変数が増えている)
$ x_i \ $の値からyの予測値を直線で考える方法。

  • 多重共線性に気を付ける(相関の強い変数があるとモデルに悪影響が出ることがある)
  • 場合によっては変数を抽出する

y = a + b_1x_1 +b_2x_2+ \cdots +b_ix_i

多項式回帰

サンプルコード
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree=2)
x_poly = poly_reg.fit_transform(x)
reg = LinearRegression()
reg.fit(x_poly,y)

#可視化
plt.scatter(x, y, color='red')
plt.plot(x.values, reg.predict(x_poly), color='blue')

事前に多項式回帰が当てはまるかどうかは、直感的には見えづらい(x2とかの次元もあるため)
degreeが増えるともっとぐにゃぐにゃの曲線も作れるが、適切に定めないと過学習になりがち。
モデルを作ってみて、結果が良ければ採用する。


y = a + b_1x_1 +b_2{x_2}^2

image.png

その他サンプルコード

※各モデルのサンプルコードはモデルの説明分に記載。

モデルの評価
#平均絶対誤差 (MAE)
import sklearn.metrics as sk
print(sk.mean_absolute_error(y_test, y_pred))
#平均二乗誤差 (MSE)
print(sk.mean_squared_error(y_test, y_pred))
#決定係数 (R2):回帰の当てはまりの良さ。最も良い場合、1.0となる。
print(sk.r2_score(y_test, y_pred))

分類

〇〇かどうか

ロジスティック回帰

サンプルコード
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import PolynomialFeatures
clf = LogisticRegression()
clf.fit(x_train, y_train)
y_pred = clf.predict(x_test)

統計学の考え方をつかっている。
0,1が混合になるあたりの閾値をシグモイド関数を使って確率で表すことができる

y=B_0\times{B_1}^{x1}\times{B_2}^{x2}\\

image.png

SVM

(仮定した)境界と一番近いデータをサポートベクトルとし、サポートベクトルとの距離=マージンを最大化するようにサポートベクトルと境界を設定する
image.png

分類木

各質問を通して、不純度を減らしていく
image.png

こちらもどうぞ:Titanicコンペで機械学習入門

サンプルコード
```python from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier(max_depth=5, min_samples_leaf=5, random_state=0) clf.fit(x_train,y_train) #学習 clf.score(x_test, y_test) #モデルの評価 ```
ランダムフォレスト:サンプルコード
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
#GridSearchCVを使うと最適なパラメータがどれか、自動で探すことができる
param_grid = {'max_depth':[None, 5, 10, 20], #ノードの深さの制限値
              'n_estimators':[20, 50, 100]} #決定木の数
clf = GridSearchCV(estimator=RandomForestClassifier(random_state=0),
                   param_grid = param_grid,
                   scoring = 'accuracy',
                   cv = 5) #公差検証
clf.fit(x_train,y_train) #学習
clf.score(x_test, y_test) #モデルの評価
clf.best_params_ #最適なパラメータがどうだったか
勾配ブ―スティング:サンプルコード
```python from sklearn.ensemble import GradientBoostingClassifier from sklearn.model_selection import GridSearchCV #GridSearchCVを使うと最適なパラメータがどれか、自動で探すことができる param_grid = {'max_depth':[None, 5, 10, 20], #ノードの深さの制限値 'n_estimators':[20, 50, 100], #決定木の数 'learning_rate':[0.01, 0.03, 0.05]} #決定木を作るときの学習率 clf = GridSearchCV(estimator=GradientBoostingClassifier(random_state=0), param_grid = param_grid, scoring = 'accuracy', cv = 5 #公差検証 ) clf.fit(x_train,y_train) #学習 clf.score(x_test, y_test) #モデルの評価 clf.best_params_ #最適なパラメータがどうだったか ```

その他のサンプルコード

モデルの評価
```python #評価 import sklearn.metrics as sk from sklearn.metrics import confusion_matrix y_pred = clf.predict(x_test) confusion_matrix(y_true=y_test, y_pred=y_pred) '正解率:{}'.format(sk.accuracy_score(y_true=y_test, y_pred=y_pred)) '適合率:{}'.format(sk.precision_score(y_true=y_test, y_pred=y_pred)) '再現率:{}'.format(sk.recall_score(y_true=y_test, y_pred=y_pred)) 'F1スコア:{}'.format(sk.f1_score(y_true=y_test, y_pred=y_pred)) #モデルを使って予測を出力する test = preprocessing(test) result = clf.predict(test) result.to_csv('./submission.csv', encoding='UTF-8', header=True, index=True) ```

教師なし

クラスタリング

k-means

引用:K-means 法を D3.js でビジュアライズしてみた

参考:k-meansの最適なクラスター数を調べる方法

サンプルコード
#最適なクラスターの数を見つける
#エルボー法
from sklearn.cluster import KMeans
wcss = []
for i in range(1,11):
    kmeans = KMeans(n_clusters=i,init='k-means++',random_state=0)
    kmeans.fit(x)
    wcss.append(kmeans.inertia_)
plt.plot(range(1,11),wcss)
plt.xlabel("number pf clusters")
plt.ylabel('WCSS')

#エルボー法でわかったクラス―数で学習
kmeans = KMeans(n_clusters=4, init='k-means++', random_state=0)
y_kmeans= kmeans.fit_predict(x)
plt.scatter(x[y_kmeans==0, 0], x[y_kmeans==0,1], s=100, color='red', label='cluster2')
plt.scatter(x[y_kmeans==1, 0], x[y_kmeans==1,1], s=100, color='blue', label='cluster2')
plt.scatter(x[y_kmeans==2, 0], x[y_kmeans==2,1], s=100, color='green', label='cluster3')
plt.scatter(x[y_kmeans==3, 0], x[y_kmeans==3,1], s=100, color='cyan', label='cluster4')
plt.scatter(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1], color='yellow', label="center") #重心

強化学習

(これから勉強します…)

ディープラーニング

ニューラルネットワークの層を多層化し、特徴量を自動で判別する

次元削減

PCA
UMAP
t-SNE

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?