scikit-learnとnumpyとmatplotlibを使い慣れていることを前提に回答しています。理解できない場合は検索したりして理解を深めてからトライしてください。
データの読み込み
以下の2つのnumpy配列を作ります。どんな手段で生成するにせよ、テキストから読み込んで最終的に作れればオッケーです。
X
:各データのx座標とy座標を格納。shape=(50, 2)
y
:各データのクラスを格納。shape=(50, )
やり方がわかるなら自分で好きな方法で行ってください。teratailで助言を求める場合、データ形式がわからないと誰も手の出しようがないと思います。
SVMの学習
学習は普通にやります。
python
1from sklearn.svm import SVC
2clf = SVC()
3clf.fit(X, y)
トレーニングデータとテストデータを分離する、パラメータを調整するなど、工夫のしようは色々あります。必要に応じてやってください。
予測させる
この場合、まず図上の全体を予測させる必要があります。グリッド上のデータを作成し、予測を行わせます。
python
1# この2つは自由に調整可能
2gridsize = 0.1
3margin = 0.5
4
5x_min = X[:, 0].min() - margin
6x_max = X[:, 0].max() + margin
7y_min = X[:, 1].min() - margin
8y_max = X[:, 1].max() + margin
9
10xx, yy = np.meshgrid(np.arange(x_min, x_max, gridsize),
11 np.arange(y_min, y_max, gridsize))
12
13pred = clf.predict(np.c_[xx.ravel(), yy.ravel()])
プロットする
基本的には得られた予測と元のデータを適当に重ねてプロットしてあげればそれで良いでしょう。このあたりについては添付したコードやscikit-learnのサンプルを参考にしてください。
なお、境界線のプロットにはエッジ検出する、確率を予測させて0に近いところを取り出すなど、若干の工夫が必要です。色を塗り分ける方が簡単です。
サンプル
irisの最初の2クラス、2次元でやったやつを置いておきます。
python
1import numpy as np
2import matplotlib.pyplot as plt
3from sklearn.datasets import load_iris
4from sklearn.svm import SVC
5
6iris = load_iris()
7X = iris.data[iris.target!=2][:, [0, 1]]
8y = iris.target[iris.target!=2]
9
10clf = SVC()
11clf.fit(X, y)
12
13gridsize = 0.02
14margin = 0.5
15
16x_min = X[:, 0].min() - margin
17x_max = X[:, 0].max() + margin
18y_min = X[:, 1].min() - margin
19y_max = X[:, 1].max() + margin
20
21xx, yy = np.meshgrid(np.arange(x_min, x_max, gridsize),
22 np.arange(y_min, y_max, gridsize))
23
24Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
25
26for i in range(2):
27 plt.scatter(X[y==i,0], X[y==i,1], label=iris.target_names[i], c="rb"[i])
28
29plt.legend()
30plt.contourf(xx, yy, Z, cmap="RdBu", alpha=0.1)
31plt.savefig("result.png")
32
また、以下が参考になるでしょう。scikit-learnのexampleには他にも参考になるコードがたくさんあるので、見るときっと色々なことを学べると思います。
Classifier comparison — scikit-learn 0.22.1 documentation
Plot different SVM classifiers in the iris dataset — scikit-learn 0.22.1 documentation