Go에서 IrisDataSet의 산점도 그리기
16297 단어 5gonumMachineLearning
Go에서 IrisDataset의 산점도 작성
이 기사는 Go4 Advent Calendar 2019의 넷째 날 기사입니다.
동기 부여
「기계 학습이라고 하면 Python, Python이라고 하면 기계 학습.」라고 해도 과언이 아닐 정도입니다.
많은 책과 많은 웹상의 기사, Kaggle의 노트와 토론 정보, 많이 있습니다.
그러나 라이브러리는 갖추어져 있지 않을지도 모릅니다만 부족한 것은 스스로 만들면서, Go로 기계 학습을 하고 싶습니다.
우선, 목표는 처음부터 만드는 딥 러닝을 Go로 구현하여 Kaggle의 튜토리얼을 몇 가지 도전하는 것입니다.
이번에는 Iris의 데이터 세트를 산점도로 해보고 싶습니다.
이번 코드입니다. : htps : // 기주 b. 코 m/유지테시마/pぉt_해 st
산점도 만들기
사용 데이터 : htps : // 기 st. 기주 b. 코 m/네 tj/8836201
가쿠 조각의 길이와 폭, 꽃잎의 길이와 폭, 팜의 종류의 이름이라는 5개의 값이 들어간 데이터가 151개 있습니다.
아야메의 종류는 3 종류입니다. 이 데이터는 매우 유명한 데이터입니다.
우선, 사용하는 라이브러리입니다만, gonum
라고 하는 라이브라이를 사용합니다.gonum
는 파이썬에서 말하는 행렬 계산을 제공하는 numpy
별로, 사용법의 샘플도 많지 않기 때문에, 사용하면서 부족한 곳이 있는지 등을 들여다 갑니다.
디렉토리 구성은 다음과 같이 했습니다.
DRY가 아니기 때문에 앞으로 고쳐 나갈 것입니다.
.
├── go.mod
├── go.sum
├── iris.csv
├── main.go
├── main.go_bk
├── plot
│ ├── plotPetal.go
│ └── plotSepal.go
├── plotPetal.png
└── plotSepal.png
main.go
"github.com/yujiteshima/plot_test/plot"부분은 자신의 환경에 맞게 모듈의 경로를 넣어 주세요.
상대 패스에서는 go module을 사용하고 있을 때는 matplotlib
scipy
참고 : htps : // 이 m / 유지 테시 마 / ms / 8dc2f782f27f147 A1E3E
main.gopackage main
import (
"github.com/yujiteshima/plot_test/plot"
)
func main() {
plot.PlotSepal()
plot.PlotPetal()
}
main에서는 PlotSepal이라고 하는 꽁치의 폭과 길이의 산포도와 PlotPetal이라는 꽃잎의 폭과 길이의 산포도의 2개의 산포도를 png 파일로서 출력하는 것만의 내용으로 되어 있습니다.
PlotSepal.go
package plot
import (
"encoding/csv"
"image/color"
"os"
"strconv"
"gonum.org/v1/plot"
"gonum.org/v1/plot/plotter"
"gonum.org/v1/plot/vg"
)
func plotPointsSepal(x string) plotter.XYs {
pts := make(plotter.XYs, 150)
file, err := os.Open("./iris.csv")
if err != nil {
panic(err)
}
defer file.Close()
reader := csv.NewReader(file)
var line []string
for i := range pts {
line, err = reader.Read()
if err != nil {
panic(err)
}
if line[4] == x {
pts[i].X, _ = strconv.ParseFloat(line[0], 64)
pts[i].Y, _ = strconv.ParseFloat(line[1], 64)
}
}
return pts
}
func PlotSepal() {
// 図の生成
p, err := plot.New()
if err != nil {
panic(err)
}
//label
p.Title.Text = "Sepal"
p.X.Label.Text = "length"
p.Y.Label.Text = "width"
// 補助線
p.Add(plotter.NewGrid())
x1 := "Setosa"
x2 := "Versicolor"
x3 := "Virginica"
// 散布図の作成
plot1, err := plotter.NewScatter(plotPointsSepal(x1))
if err != nil {
panic(err)
}
plot2, err := plotter.NewScatter(plotPointsSepal(x2))
if err != nil {
panic(err)
}
plot3, err := plotter.NewScatter(plotPointsSepal(x3))
if err != nil {
panic(err)
}
//色を指定する.
plot1.GlyphStyle.Color = color.RGBA{R: 255, B: 128, A: 55}
plot2.GlyphStyle.Color = color.RGBA{R: 155, B: 128, A: 255}
plot3.GlyphStyle.Color = color.RGBA{R: 55, B: 255, A: 128}
//plot1,plot2をplot
p.Add(plot1)
p.Add(plot2)
p.Add(plot3)
//label
p.Legend.Add("Seotsa", plot1)
p.Legend.Add("Versicolor", plot2)
p.Legend.Add("Virginica", plot3)
// 座標範囲
p.X.Min = 0
p.X.Max = 10
p.Y.Min = 0
p.Y.Max = 10
// plotSepal.pngに保存
if err := p.Save(6*vg.Inch, 6*vg.Inch, "plotSepal.png"); err != nil {
panic(err)
}
}
이와 같이 사용합니다만, 이번 CSV 파일을 go run
로 열어 차례로 읽어들여, if문으로 꽃의 종류를 나누어 플롯 했습니다.
go의 외부 라이브러리에는 python에서 말하는 pandas와 마찬가지로 dataframe을 다룰 수있는 이름도 dataframe이라는 라이브러리가 있습니다.
데이터의 null값을 조사하거나, 형태가 다른 데이터가 섞여 있거나 했을 때의 데이터 핸들링을 간단하게 실시할 수 있는 라이브러리를 이용하지 않으면 다른 데이터에서는 사용할 수 없다고 느꼈습니다. 다음은 dataframe을 사용하여 gonum.plot을 사용하고 싶습니다.
출력한 산포도
본 것만으로 아야메의 종류가 갈라지는 조각의 데이터와 꽃잎의 데이터로부터 분류가 가능한 느낌이 든다고 생각합니다.
요약
가쿠 조각과 꽃잎의 산포도를 만드는데 거의 같은 함수를 2개 정의해 사용하고 있으므로, 거기를 DRY로 하고 싶다. 또, 데이터수를 150으로 자신이 결정한 외부 파라미터와 같이 코드 안에 넣어 버리고 있으므로, 거기도 고쳐, 사용해 돌릴 수 있는 형태로 고치는 궁리를 해 나가고 싶다.
다음은, 실제로 분류를 하는 부분을 구현해 갑니다.
Reference
이 문제에 관하여(Go에서 IrisDataSet의 산점도 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yujiteshima/items/5b78d4ecc8ee567bd379
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
.
├── go.mod
├── go.sum
├── iris.csv
├── main.go
├── main.go_bk
├── plot
│ ├── plotPetal.go
│ └── plotSepal.go
├── plotPetal.png
└── plotSepal.png
package main
import (
"github.com/yujiteshima/plot_test/plot"
)
func main() {
plot.PlotSepal()
plot.PlotPetal()
}
package plot
import (
"encoding/csv"
"image/color"
"os"
"strconv"
"gonum.org/v1/plot"
"gonum.org/v1/plot/plotter"
"gonum.org/v1/plot/vg"
)
func plotPointsSepal(x string) plotter.XYs {
pts := make(plotter.XYs, 150)
file, err := os.Open("./iris.csv")
if err != nil {
panic(err)
}
defer file.Close()
reader := csv.NewReader(file)
var line []string
for i := range pts {
line, err = reader.Read()
if err != nil {
panic(err)
}
if line[4] == x {
pts[i].X, _ = strconv.ParseFloat(line[0], 64)
pts[i].Y, _ = strconv.ParseFloat(line[1], 64)
}
}
return pts
}
func PlotSepal() {
// 図の生成
p, err := plot.New()
if err != nil {
panic(err)
}
//label
p.Title.Text = "Sepal"
p.X.Label.Text = "length"
p.Y.Label.Text = "width"
// 補助線
p.Add(plotter.NewGrid())
x1 := "Setosa"
x2 := "Versicolor"
x3 := "Virginica"
// 散布図の作成
plot1, err := plotter.NewScatter(plotPointsSepal(x1))
if err != nil {
panic(err)
}
plot2, err := plotter.NewScatter(plotPointsSepal(x2))
if err != nil {
panic(err)
}
plot3, err := plotter.NewScatter(plotPointsSepal(x3))
if err != nil {
panic(err)
}
//色を指定する.
plot1.GlyphStyle.Color = color.RGBA{R: 255, B: 128, A: 55}
plot2.GlyphStyle.Color = color.RGBA{R: 155, B: 128, A: 255}
plot3.GlyphStyle.Color = color.RGBA{R: 55, B: 255, A: 128}
//plot1,plot2をplot
p.Add(plot1)
p.Add(plot2)
p.Add(plot3)
//label
p.Legend.Add("Seotsa", plot1)
p.Legend.Add("Versicolor", plot2)
p.Legend.Add("Virginica", plot3)
// 座標範囲
p.X.Min = 0
p.X.Max = 10
p.Y.Min = 0
p.Y.Max = 10
// plotSepal.pngに保存
if err := p.Save(6*vg.Inch, 6*vg.Inch, "plotSepal.png"); err != nil {
panic(err)
}
}
Reference
이 문제에 관하여(Go에서 IrisDataSet의 산점도 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yujiteshima/items/5b78d4ecc8ee567bd379텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)