Pycaretによる鋳鉄の黒鉛形状の機械学習

# はじめに
JIS G5502のISO法による黒鉛球状化率の測定は、組織画像の個々の黒鉛をタイプⅠ～Ⅵの黒鉛形状区分（ISO945-1）と比較して、ⅤとⅥに分類される黒鉛の面積を黒鉛の全面積で割って求めます。ここで、タイプⅤとⅥの黒鉛に分類する方法としては
①丸み係数（＝「黒鉛の面積」÷「黒鉛の長軸を直径とする円の面積」）が0.6以上になる黒鉛をタイプⅤ以上とする
②上記①以外の方法でタイプⅤとⅥに分類する
があります。このうち、①は画像処理で実施できますが、黒鉛形状区分のタイプⅤ、Ⅵの画像について丸み係数だけで分類できるか調べたところ、[以前の記事](https://qiita.com/_Moony/items/6df5e2ffcf3955c1f04c)で紹介したように難しいことが分かりました。
そこで今回は、②の方法を機械学習を用いて試みました。

# 方法
- [斎藤氏<sup>1)</sup>](http://www.iri.pref.niigata.jp/topics/R3/3kin3.html)が紹介された方法にならい、JIS G5502 ISO法で参照しているISO945-1のFig.1のタイプⅠ～Ⅵの個々の黒鉛に対して、<i>CSF</i>、<i>Round</i>など9個の形状パラメータを求め、データセットのファイルを作成します。データセットの作成には[以前の記事](https://qiita.com/_Moony/items/62ab3d4e64f2a8105bce)のプログラムを用います。
- 作成したデータセットのファイルを使って[Pycaret](https://pycaret.org/)による機械学習を行います。Pycaretは各種モデルで学習を行った後、精度などの高い順に結果の一覧表を表示してくれます。
- 9個の形状パラメータのすべてを使ったモデルで黒鉛の形状判定を行うのは、直感的にパラメータが多すぎると考えられたので、結果の一覧表で一番上に表示されたモデルについて目的変数の重要度（Feature Importance）をプロットし、上位3個の形状パラメータのみ用いて、Pycaretによる機械学習を再度行います。
- 学習の結果、最も正解率が高かったモデルに対してファインチューニングを行い、最終モデルを作成します。最終モデルはファイルで書き出します。

# 結果
## 作成したデータセット
ISO945-1のFig.1のタイプⅠ～Ⅵについて、個々の黒鉛の形状パラメータを求めたデータセットを次に示します。データセットにおいて、左端の列のNo.0～5はタイプⅠ～Ⅵを表します。
<details>
<summary>データセット（▶で開き、▼で閉じます）</summary>
<pre>
<code>
No.	CSF	Round	CSFm	CSFg	AR	MR	BF	Conv	Sol
0	0.036	0.036	0.036	0.001	0.379	0.034	0.09	0.725	0.113
0	0.118	0.062	0.086	0.005	0.155	0.053	0.338	0.919	0.402
0	0.108	0.059	0.08	0.005	0.173	0.049	0.281	0.911	0.348
0	0.133	0.067	0.095	0.006	0.137	0.063	0.462	0.927	0.547
0	0.079	0.096	0.087	0.008	0.534	0.082	0.154	0.709	0.23
0	0.098	0.049	0.069	0.003	0.1	0.044	0.441	0.928	0.508
0	0.109	0.054	0.076	0.004	0.107	0.062	0.582	0.933	0.537
0	0.111	0.056	0.079	0.004	0.12	0.047	0.394	0.928	0.446
0	0.166	0.115	0.138	0.016	0.305	0.14	0.46	0.847	0.441
0	0.138	0.069	0.098	0.007	0.119	0.067	0.562	0.932	0.545
0	0.134	0.134	0.134	0.018	0.511	0.086	0.168	0.799	0.29
0	0.13	0.119	0.124	0.015	0.449	0.082	0.183	0.802	0.327
0	0.105	0.053	0.075	0.004	0.11	0.06	0.546	0.926	0.481
0	0.137	0.066	0.096	0.006	0.083	0.063	0.765	0.942	0.743
0	0.156	0.077	0.11	0.008	0.121	0.071	0.585	0.937	0.636
0	0.125	0.062	0.088	0.006	0.09	0.056	0.618	0.93	0.595
0	0.145	0.103	0.122	0.013	0.382	0.076	0.199	0.872	0.316
0	0.168	0.084	0.119	0.01	0.102	0.071	0.695	0.935	0.731
0	0.211	0.12	0.159	0.019	0.212	0.103	0.488	0.914	0.546
0	0.211	0.107	0.15	0.016	0.155	0.093	0.604	0.94	0.665
0	0.152	0.072	0.105	0.008	0.113	0.068	0.602	0.956	0.66
0	0.275	0.144	0.199	0.029	0.163	0.126	0.773	0.936	0.828
0	0.248	0.132	0.181	0.024	0.192	0.132	0.69	0.929	0.695
0	0.21	0.106	0.149	0.016	0.143	0.096	0.672	0.942	0.691
0	0.263	0.136	0.189	0.026	0.169	0.126	0.746	0.936	0.788
0	0.2	0.101	0.142	0.014	0.138	0.1	0.73	0.936	0.754
0	0.224	0.129	0.17	0.022	0.262	0.12	0.457	0.91	0.558
0	0.26	0.14	0.191	0.027	0.161	0.121	0.752	0.932	0.789
0	0.283	0.152	0.207	0.031	0.214	0.164	0.766	0.931	0.75
0	0.228	0.118	0.164	0.019	0.171	0.15	0.879	0.941	0.645
0	0.22	0.115	0.159	0.018	0.158	0.098	0.618	0.93	0.691
0	0.294	0.154	0.213	0.033	0.186	0.136	0.733	0.941	0.791
0	0.261	0.137	0.189	0.026	0.143	0.131	0.919	0.936	0.827
0	0.246	0.127	0.177	0.023	0.121	0.112	0.919	0.935	0.882
0	0.251	0.131	0.182	0.024	0.157	0.111	0.705	0.931	0.778
0	0.486	0.275	0.366	0.1	0.313	0.266	0.851	0.954	0.898
0	0.417	0.234	0.312	0.073	0.24	0.22	0.918	0.946	0.866
0	0.329	0.177	0.242	0.043	0.195	0.184	0.944	0.951	0.811
0	0.324	0.168	0.233	0.039	0.192	0.15	0.78	0.945	0.821
0	0.319	0.174	0.236	0.041	0.236	0.147	0.625	0.935	0.763
0	0.561	0.322	0.425	0.137	0.335	0.289	0.864	0.952	0.933
1	0.052	0.181	0.097	0.018	0.671	0.178	0.265	0.421	0.357
1	0.042	0.207	0.094	0.019	0.607	0.167	0.275	0.381	0.364
1	0.068	0.16	0.104	0.017	0.551	0.144	0.262	0.482	0.393
1	0.055	0.113	0.079	0.009	0.482	0.139	0.289	0.528	0.278
1	0.083	0.27	0.149	0.04	0.766	0.215	0.28	0.484	0.42
1	0.095	0.259	0.157	0.04	0.885	0.235	0.265	0.556	0.449
1	0.11	0.106	0.108	0.011	0.325	0.111	0.341	0.737	0.357
1	0.105	0.119	0.112	0.013	0.284	0.182	0.641	0.652	0.463
1	0.127	0.324	0.203	0.066	0.802	0.243	0.303	0.57	0.441
1	0.182	0.206	0.194	0.04	0.531	0.192	0.362	0.702	0.497
1	0.111	0.208	0.152	0.032	0.598	0.219	0.366	0.611	0.376
1	0.205	0.139	0.168	0.023	0.338	0.182	0.54	0.847	0.538
1	0.213	0.38	0.285	0.108	0.773	0.323	0.419	0.692	0.518
1	0.089	0.098	0.093	0.009	0.296	0.098	0.331	0.688	0.331
1	0.136	0.218	0.172	0.037	0.598	0.214	0.358	0.653	0.395
1	0.184	0.219	0.201	0.044	0.596	0.201	0.338	0.712	0.498
1	0.207	0.216	0.211	0.046	0.54	0.201	0.372	0.787	0.49
1	0.517	0.435	0.474	0.206	0.72	0.475	0.66	0.911	0.83
1	0.338	0.259	0.296	0.077	0.477	0.278	0.582	0.846	0.666
1	0.449	0.355	0.399	0.142	0.483	0.33	0.682	0.882	0.752
1	0.336	0.231	0.278	0.064	0.386	0.191	0.495	0.91	0.603
1	0.581	0.376	0.468	0.176	0.457	0.437	0.955	0.943	0.897
1	0.405	0.241	0.313	0.075	0.289	0.215	0.743	0.936	0.797
2	0.126	0.194	0.156	0.03	0.402	0.136	0.338	0.604	0.502
2	0.179	0.396	0.266	0.106	0.87	0.232	0.267	0.626	0.524
2	0.225	0.178	0.2	0.036	0.38	0.164	0.431	0.818	0.523
2	0.344	0.383	0.363	0.139	0.548	0.304	0.554	0.793	0.665
2	0.122	0.157	0.138	0.022	0.37	0.111	0.299	0.635	0.505
2	0.224	0.183	0.202	0.037	0.43	0.144	0.335	0.819	0.531
2	0.346	0.401	0.373	0.149	0.562	0.373	0.663	0.798	0.651
2	0.211	0.289	0.247	0.071	0.511	0.207	0.405	0.666	0.599
2	0.309	0.233	0.268	0.062	0.39	0.236	0.605	0.828	0.686
2	0.354	0.316	0.334	0.106	0.442	0.286	0.649	0.84	0.686
2	0.322	0.242	0.28	0.068	0.35	0.189	0.539	0.867	0.715
2	0.382	0.236	0.3	0.071	0.284	0.244	0.859	0.909	0.817
2	0.458	0.421	0.439	0.185	0.736	0.402	0.547	0.896	0.74
2	0.322	0.232	0.273	0.063	0.371	0.236	0.636	0.85	0.699
2	0.318	0.333	0.325	0.108	0.59	0.269	0.456	0.813	0.604
2	0.378	0.267	0.317	0.085	0.391	0.243	0.622	0.889	0.739
2	0.336	0.388	0.361	0.14	0.617	0.27	0.437	0.743	0.76
2	0.491	0.385	0.435	0.168	0.488	0.351	0.72	0.873	0.851
2	0.397	0.25	0.315	0.079	0.351	0.225	0.641	0.915	0.759
2	0.28	0.237	0.258	0.061	0.424	0.225	0.53	0.83	0.58
2	0.42	0.401	0.41	0.165	0.59	0.317	0.536	0.865	0.694
2	0.348	0.401	0.374	0.15	0.614	0.291	0.474	0.812	0.617
2	0.48	0.338	0.403	0.136	0.398	0.366	0.92	0.91	0.799
2	0.31	0.215	0.259	0.056	0.378	0.171	0.454	0.882	0.623
2	0.403	0.296	0.346	0.102	0.399	0.257	0.643	0.893	0.702
2	0.434	0.296	0.358	0.106	0.379	0.293	0.773	0.909	0.799
2	0.462	0.306	0.376	0.115	0.382	0.281	0.736	0.912	0.794
2	0.566	0.431	0.494	0.213	0.592	0.418	0.706	0.914	0.888
2	0.41	0.283	0.341	0.097	0.333	0.253	0.757	0.901	0.757
2	0.347	0.246	0.293	0.072	0.386	0.214	0.555	0.883	0.645
2	0.405	0.24	0.312	0.075	0.318	0.261	0.82	0.925	0.836
2	0.529	0.61	0.568	0.347	0.82	0.461	0.562	0.856	0.82
2	0.582	0.403	0.484	0.195	0.445	0.374	0.84	0.922	0.877
2	0.519	0.34	0.42	0.143	0.421	0.316	0.75	0.919	0.841
2	0.377	0.233	0.296	0.069	0.344	0.211	0.615	0.918	0.734
2	0.366	0.316	0.34	0.107	0.429	0.281	0.654	0.834	0.694
2	0.371	0.218	0.284	0.062	0.276	0.198	0.718	0.926	0.783
2	0.521	0.35	0.427	0.149	0.39	0.334	0.857	0.921	0.85
2	0.593	0.453	0.518	0.235	0.519	0.402	0.776	0.917	0.86
2	0.443	0.251	0.333	0.084	0.323	0.294	0.909	0.93	0.864
2	0.568	0.368	0.457	0.168	0.451	0.362	0.802	0.939	0.876
2	0.47	0.275	0.36	0.099	0.286	0.279	0.976	0.943	0.891
2	0.517	0.513	0.515	0.264	0.699	0.452	0.647	0.889	0.846
2	0.568	0.349	0.445	0.155	0.396	0.342	0.866	0.94	0.904
2	0.567	0.347	0.444	0.154	0.377	0.322	0.854	0.941	0.919
2	0.455	0.367	0.409	0.15	0.494	0.314	0.637	0.882	0.79
2	0.446	0.27	0.347	0.094	0.3	0.256	0.855	0.935	0.826
2	0.513	0.313	0.401	0.125	0.358	0.32	0.895	0.934	0.88
2	0.562	0.374	0.459	0.172	0.41	0.344	0.838	0.931	0.875
2	0.456	0.256	0.342	0.088	0.304	0.27	0.887	0.94	0.907
2	0.62	0.376	0.483	0.182	0.406	0.389	0.957	0.945	0.955
2	0.523	0.329	0.414	0.136	0.412	0.359	0.873	0.938	0.85
2	0.565	0.341	0.439	0.15	0.346	0.33	0.954	0.949	0.919
2	0.57	0.366	0.457	0.167	0.407	0.352	0.864	0.931	0.888
3	0.203	0.599	0.349	0.209	0.853	0.497	0.583	0.533	0.754
3	0.181	0.503	0.301	0.151	0.8	0.364	0.455	0.546	0.66
3	0.16	0.344	0.235	0.081	0.722	0.342	0.474	0.54	0.646
3	0.274	0.604	0.407	0.246	0.891	0.476	0.534	0.638	0.726
3	0.167	0.44	0.271	0.119	0.785	0.265	0.338	0.546	0.65
3	0.278	0.443	0.351	0.155	0.753	0.334	0.444	0.676	0.712
3	0.399	0.577	0.479	0.276	0.777	0.523	0.673	0.757	0.784
3	0.328	0.443	0.381	0.169	0.6	0.43	0.717	0.723	0.756
3	0.443	0.495	0.468	0.232	0.736	0.532	0.723	0.789	0.808
3	0.409	0.516	0.459	0.237	0.672	0.481	0.716	0.768	0.802
3	0.475	0.518	0.496	0.257	0.703	0.543	0.772	0.813	0.808
3	0.53	0.588	0.558	0.328	0.728	0.564	0.775	0.852	0.821
3	0.451	0.517	0.483	0.25	0.639	0.461	0.722	0.832	0.778
3	0.396	0.603	0.488	0.295	0.853	0.531	0.623	0.735	0.776
3	0.567	0.577	0.572	0.33	0.756	0.531	0.703	0.855	0.852
3	0.434	0.435	0.434	0.189	0.721	0.423	0.586	0.852	0.749
3	0.511	0.611	0.559	0.342	0.798	0.51	0.638	0.827	0.818
3	0.497	0.52	0.508	0.264	0.662	0.47	0.71	0.836	0.832
3	0.418	0.421	0.419	0.176	0.612	0.383	0.626	0.822	0.726
3	0.508	0.563	0.535	0.301	0.774	0.538	0.695	0.829	0.823
3	0.395	0.456	0.425	0.194	0.702	0.341	0.485	0.813	0.698
3	0.546	0.533	0.539	0.287	0.685	0.522	0.763	0.861	0.845
3	0.5	0.527	0.513	0.27	0.769	0.466	0.606	0.839	0.797
3	0.602	0.697	0.648	0.452	0.873	0.605	0.694	0.87	0.867
3	0.616	0.659	0.637	0.42	0.851	0.598	0.703	0.872	0.86
3	0.711	0.473	0.58	0.275	0.516	0.493	0.956	0.952	0.96
3	0.667	0.416	0.527	0.219	0.443	0.43	0.972	0.955	0.968
3	0.762	0.552	0.648	0.358	0.589	0.575	0.976	0.957	0.967
3	0.786	0.59	0.681	0.402	0.639	0.588	0.92	0.956	0.968
3	0.839	0.607	0.714	0.433	0.622	0.599	0.963	0.969	0.983
4	0.287	0.532	0.391	0.208	0.672	0.45	0.67	0.634	0.789
4	0.36	0.634	0.478	0.303	0.812	0.481	0.592	0.686	0.842
4	0.441	0.646	0.534	0.345	0.844	0.576	0.683	0.775	0.801
4	0.473	0.637	0.549	0.349	0.767	0.512	0.667	0.787	0.857
4	0.377	0.631	0.488	0.308	0.778	0.535	0.688	0.697	0.838
4	0.454	0.603	0.523	0.316	0.862	0.559	0.648	0.791	0.81
4	0.518	0.658	0.584	0.384	0.852	0.609	0.715	0.817	0.844
4	0.465	0.644	0.548	0.353	0.724	0.5	0.69	0.777	0.853
4	0.604	0.585	0.594	0.348	0.729	0.577	0.792	0.872	0.881
4	0.6	0.675	0.636	0.43	0.834	0.618	0.741	0.86	0.873
4	0.607	0.572	0.589	0.337	0.675	0.543	0.805	0.885	0.894
4	0.725	0.655	0.689	0.451	0.845	0.658	0.779	0.926	0.913
4	0.716	0.657	0.686	0.45	0.792	0.613	0.774	0.929	0.915
4	0.657	0.723	0.689	0.498	0.808	0.618	0.765	0.894	0.896
4	0.745	0.761	0.753	0.573	0.903	0.664	0.736	0.926	0.93
4	0.743	0.64	0.69	0.442	0.806	0.672	0.834	0.938	0.944
4	0.812	0.661	0.733	0.484	0.801	0.668	0.834	0.966	0.96
4	0.664	0.444	0.543	0.241	0.518	0.442	0.854	0.942	0.918
4	0.745	0.692	0.718	0.497	0.803	0.692	0.862	0.934	0.926
5	0.86	0.852	0.856	0.729	0.909	0.869	0.955	0.943	0.985
5	0.854	0.9	0.877	0.789	0.932	0.903	0.969	0.938	0.985
5	0.873	0.895	0.884	0.791	0.93	0.889	0.956	0.95	0.986
5	0.859	0.933	0.896	0.836	0.949	0.919	0.968	0.938	0.985
5	0.848	0.87	0.859	0.747	0.903	0.859	0.951	0.939	0.985
5	0.851	0.888	0.869	0.772	0.934	0.894	0.958	0.939	0.983
5	0.856	0.9	0.878	0.79	0.921	0.888	0.964	0.943	0.984
5	0.847	0.798	0.822	0.656	0.853	0.785	0.92	0.942	0.985
5	0.847	0.88	0.864	0.76	0.915	0.869	0.95	0.941	0.978
5	0.837	0.791	0.814	0.644	0.828	0.766	0.925	0.946	0.976
5	0.831	0.792	0.811	0.642	0.844	0.801	0.95	0.937	0.978
5	0.784	0.689	0.735	0.507	0.832	0.697	0.838	0.945	0.953
5	0.835	0.778	0.806	0.628	0.814	0.778	0.957	0.944	0.984
5	0.861	0.814	0.837	0.682	0.902	0.833	0.924	0.947	0.983
5	0.88	0.893	0.886	0.791	0.914	0.874	0.956	0.955	0.985
5	0.867	0.804	0.835	0.671	0.817	0.782	0.956	0.954	0.982
5	0.872	0.842	0.856	0.721	0.892	0.822	0.922	0.952	0.983
5	0.842	0.836	0.839	0.702	0.884	0.833	0.942	0.939	0.975
5	0.852	0.833	0.842	0.701	0.88	0.823	0.935	0.95	0.977
5	0.844	0.706	0.772	0.545	0.789	0.704	0.893	0.954	0.976
5	0.858	0.778	0.817	0.635	0.779	0.761	0.977	0.951	0.982
</code>
</pre>
</details>

## Pycaretによる機械学習プログラム


### ISO945-1のタイプⅠ～Ⅵの黒鉛形状の学習

環境は次のとおりです。
VSC 1.74.0
python 3.8.10
opencv 4.6.0.66
pycaret 2.3.5

はじめに、必要なライブラリをインポートします。

```python
import pandas as pd
from pycaret.classification import *
```

続いてデータセットを読み込みます。（データセットのファイルはc:/dataにあるものとします）


```python
dataset = pd.read_csv(r'c:/Data/TrainData.csv', encoding="utf-8")
```

目的変数（ここではNo.（黒鉛タイプ））を指定します。以下のコマンドを実行すると指示待ちのダイアログが表示されるので、エンターキーを押します。session_id=123 のようにsessionに数字を指定することで、毎回同じ学習データと検証データが使用されます。

```python
exp1 = setup(dataset, target = 'No.', session_id=123) 
```

各種モデルの比較をします。

```python
compare_models()
```

以下のように、結果の一覧が表示されます。
![result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/c6f73712-8316-1ab3-e272-b18270ba25b8.jpeg)

結果の一番上のモデル（lda：Linear Discriminant Analysis）について、モデルを作成し、最適化します。

```python
lda_model = create_model('lda')
tuned_lda_model = tune_model(lda_model)
```

これを最終モデルとして保存します。

```python
final_model = finalize_model(tuned_lda_model)
save_model(final_model, 'c:/Data/final_lda_model_9columns')
```

このモデルについて、目的変数の重要度（Feature Importance）をプロットします。

```python
plot_model(final_model, "feature")
```

![Graph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/61efb3e0-173b-4971-8e66-585f1455c793.jpeg)

以下では、Conv、AR、CSFmだけのデータセットで機械学習を行うこととします。
先ほどのデータセットから、Conv、AR、CSFm以外の系列を削除して、データセット（dataset3とします）を作成します。

```python
dataset3 = dataset.drop(['CSF','Round', 'CSFg', 'MR', 'BF', 'Sol'], axis='columns')
```

再度、目的変数（ここではNo.（黒鉛タイプ））を指定します。

```python
exp2 = setup(dataset3, target = 'No.', session_id=123) 
```

各種モデルの比較をします。

```python
compare_models()
```

結果が表示されます。
![result1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/7c9ad957-d265-cd12-c57c-45d8eb892000.jpeg)


結果の一番上のモデル（lightgbm：Light Gradient Boosting Machine）について、モデルを作成し、最適化します。

```python
lightgbm_model_3columns = create_model('lightgbm')
tuned_lightgbm_model_3columns = tune_model(lightgbm_model_3columns)
```

これを最終モデルとして保存します。

```python
final_model = finalize_model(tuned_lightgbm_model_3columns)
save_model(final_model, 'c:/Data/final_lightgbm_model_3columns')
```

# 終わりに
長くなりましたので、学習モデルを用いた組織画像の黒鉛形状の判定については別記事にします。