首先推荐两本适合sklearn机器学习初学者的书。
黄永昌编著的《scikit-learn 机器学习常用算法原理及编程实战》及Prateek Joshi编著的《Python Machine Learning Cookbook》,里面会对代码有一定的解释,理解起来容易些。
目的:python无界面,通过pyinstaller -F X.py打包成.exe文件后在没有python的电脑上也能用,并且能和C#窗体应用程序连接。
但是在连接过程中会遇到各种问题。
1.首先是环境:操作系统:64位win7,程序中使用了Python机器学习与科学计算第三方库:sklearn,scipy,numpy,pandas,matplotlib等。
2.打包过程:
2.1 首先下载适合自己机器版本的pyinstaller,用pip工具进行安装:pip install pyinstaller,一般这样就可以直接安装成功。
2.2 接下来就可以打包了,不过在此之前先要做一件事,把pyinstaller添加到环境变量里面,这样就可以在系统的任何位置使用pyinstaller这个命令了。(关于环境变量的概念和添加方法就不赘述了,不清楚的可以自行百度。)
2.3 万事俱备,只欠东风。这个时候,找到待打包的.py文件所在的文件夹,shift+鼠标右键选择 在此处打开命令窗口,这样当前路径已经在这个文件夹了,用命令 pyinstaller -F 文件名字.py,会看到程序已经在跑了。一会能看到文件夹中多出了一个dist文件夹,一个build文件夹和一个.spec文件(文件名和.py文件的文件名一致)。dist是发布文件夹,我们想要的.exe文件就在里面。这时双击这个exe文件出现个命令行窗口然后一闪而过,打开命令行输入x.exe回车发现错误:ModuleNotFoundError:No module named typedefs,经过不断搜索发现是sklearn和scipy库的问题,有些库不能自动导入,在.spec文件中将hiddenimports=[]修改为: hiddenimports=[‘pandas’,‘pylab’,‘scipy’,‘scipy.signal’,‘cython’, ‘sklearn’,‘sklearn.impute’,‘sklearn.preprocessing’,‘sklearn.decomposition’,‘sklearn.cluster’,‘sklearn.metrics’,‘sklearn.metrics.get_scorer’,‘sklearn.tree’,‘sklearn.ensemble’,‘sklearn.neighbors.typedefs’,‘sklearn.neighbors.quad_tree’,‘sklearn.tree._utils’,‘scipy._lib.messagestream’,‘email.mime.message’, ‘email.mime.image’, ‘email.mime.multipart’, ‘email.mime.audio’, ‘email.mime.text’]后,再运行命令pyinstaller –F x.spec,结束后通过cmd命令打开.exe文件发现该问题解决(和pandas,scipy,sklearn相关的导入错误都可以这样)。
如果这时还出现ModuleNotFoundError:No module named XX的问题,可能是由于在GitHub上下载的库未打包,解决办法:将GitHub上下载的库的文件和要打包的文件放到同一个文件夹内,只对入口文件进行打包即可。如:
入口文件为:miniSOMsave.py
库文件为:minisom.py、setup.py
命令行输入:pyinstaller -F miniSOMsave.py,第一次打包后,修改.spec文件的hiddenimports,保存后再输入:pyinstaller -F miniSOMsave.spec即可
如果还是有问题,就在hiddenimports里加入所有需要打包文件的import。
查找API过程中要与sklearn版本对应。
Sklearn API Reference:
https://scikit-learn.org/stable/modules/classes.html#module-sklearn.neighbors
3.还需要注意的问题:
3.1 如果你的GUI程序带有图片(或者其它资源)的文件夹(我的是在\res文件夹下),需要把这个文件夹拷贝到.exe文件同一路径下。
3.2 如果你的.py文件不止一个,仅仅需要把其它.py文件都放在一个目录下,只对入口.py文件打包即可。
下面是我打包成功后遇到的小问题:
4. VS参数进入Python代码中后,出现无法运用Kmean的问题。经排查测试发现该问题原因为函数参数为string类型,而Kmean参数为int类型,进行强制转换后解决该问题,d=int(n_cluster)。
5.BIRCH聚类连接VS过程中,一直出现问题,经排查发现原因为sklearn库版本为0.20.3,其中得分函数为metrics.calinski_harabaz_score,最新版为calinski_harabasz_score,运行时出现警告直接改为了最新版函数,但打包成exe后无法运行,解决办法:得分函数改为旧版的metrics.calinski_harabaz_score
6.VS不同窗体间传参。https://www.cnblogs.com/xh6300/p/6063649.html
pyinstaller打包:https://www.twblogs.net/a/5b86bb8a2b71775d1cd5c2d8/zh-cn/