浏览代码

机器学习新增了几个模型

Huan 5 年之前
父节点
当前提交
54a0c45d65
共有 2 个文件被更改,包括 214 次插入14 次删除
  1. 136 5
      Learn_Numpy.py
  2. 78 9
      Machine_learning.py

+ 136 - 5
Learn_Numpy.py

@@ -7,12 +7,17 @@ from sklearn.model_selection import train_test_split
 from sklearn.linear_model import *
 from sklearn.neighbors import KNeighborsClassifier,KNeighborsRegressor
 from sklearn.tree import DecisionTreeClassifier,DecisionTreeRegressor
+from sklearn.ensemble import (RandomForestClassifier,RandomForestRegressor,GradientBoostingClassifier,
+                              GradientBoostingRegressor)
 from sklearn.metrics import accuracy_score
 from sklearn.feature_selection import *
 from sklearn.preprocessing import *
 from sklearn.impute import SimpleImputer
-from sklearn.decomposition import PCA, IncrementalPCA,KernelPCA
+from sklearn.decomposition import PCA, IncrementalPCA,KernelPCA,NMF
 from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
+from sklearn.svm import SVC,SVR#SVC是svm分类,SVR是svm回归
+from sklearn.neural_network import MLPClassifier,MLPRegressor
+from sklearn.manifold import TSNE
 # import sklearn as sk
 
 
@@ -224,6 +229,60 @@ class Tree_Model(Study_MachineBase):
                   'max_depth':args_use['max_depth'],'min_samples_split':args_use['min_samples_split']}
         self.Model_Name = model
 
+class Forest_Model(Study_MachineBase):
+    def __init__(self,args_use,model,*args,**kwargs):#model表示当前选用的模型类型,Alpha针对正则化的参数
+        super(Forest_Model, self).__init__(*args,**kwargs)
+        Model = {'Forest_class':RandomForestClassifier,'Forest':RandomForestRegressor}[model]
+        self.Model = Model(n_estimators=args_use['n_Tree'],criterion=args_use['criterion'],max_features=args_use['max_features']
+                           ,max_depth=args_use['max_depth'],min_samples_split=args_use['min_samples_split'])
+        #记录这两个是为了克隆
+        self.n_estimators = args_use['n_Tree']
+        self.criterion = args_use['criterion']
+        self.max_features = args_use['max_features']
+        self.max_depth = args_use['max_depth']
+        self.min_samples_split = args_use['min_samples_split']
+        self.k = {'n_estimators':args_use['n_Tree'],'criterion':args_use['criterion'],'max_features':args_use['max_features'],
+                  'max_depth':args_use['max_depth'],'min_samples_split':args_use['min_samples_split']}
+        self.Model_Name = model
+
+class GradientTree_Model(Study_MachineBase):
+    def __init__(self,args_use,model,*args,**kwargs):#model表示当前选用的模型类型,Alpha针对正则化的参数
+        super(GradientTree_Model, self).__init__(*args,**kwargs)
+        Model = {'GradientTree_class':GradientBoostingClassifier,'GradientTree':GradientBoostingRegressor}[model]
+        self.Model = Model(n_estimators=args_use['n_Tree'],max_features=args_use['max_features']
+                           ,max_depth=args_use['max_depth'],min_samples_split=args_use['min_samples_split'])
+        #记录这两个是为了克隆
+        self.criterion = args_use['criterion']
+        self.splitter = args_use['splitter']
+        self.max_features = args_use['max_features']
+        self.max_depth = args_use['max_depth']
+        self.min_samples_split = args_use['min_samples_split']
+        self.k = {'criterion':args_use['criterion'],'splitter':args_use['splitter'],'max_features':args_use['max_features'],
+                  'max_depth':args_use['max_depth'],'min_samples_split':args_use['min_samples_split']}
+        self.Model_Name = model
+
+class SVC_Model(Study_MachineBase):
+    def __init__(self,args_use,model,*args,**kwargs):#model表示当前选用的模型类型,Alpha针对正则化的参数
+        super(SVC_Model, self).__init__(*args,**kwargs)
+        self.Model = SVC(C=args_use['C'],gamma=args_use['gamma'],kernel=args_use['kernel'])
+        #记录这两个是为了克隆
+        self.C = args_use['C']
+        self.gamma = args_use['gamma']
+        self.kernel = args_use['kernel']
+        self.k = {'C':args_use['C'],'gamma':args_use['gamma'],'kernel':args_use['kernel']}
+        self.Model_Name = model
+
+class SVR_Model(Study_MachineBase):
+    def __init__(self,args_use,model,*args,**kwargs):#model表示当前选用的模型类型,Alpha针对正则化的参数
+        super(SVR_Model, self).__init__(*args,**kwargs)
+        self.Model = SVR(C=args_use['C'],gamma=args_use['gamma'],kernel=args_use['kernel'])
+        #记录这两个是为了克隆
+        self.C = args_use['C']
+        self.gamma = args_use['gamma']
+        self.kernel = args_use['kernel']
+        self.k = {'C':args_use['C'],'gamma':args_use['gamma'],'kernel':args_use['kernel']}
+        self.Model_Name = model
+
 class Variance_Model(prep_Base):
     def __init__(self,args_use,model,*args,**kwargs):#model表示当前选用的模型类型,Alpha针对正则化的参数
         super(Variance_Model, self).__init__(*args,**kwargs)
@@ -617,6 +676,56 @@ class LDA_Model(prep_Base):
         x_Predict = self.Model.transform(x_data)
         return x_Predict,'LDA'
 
+class NMF_Model(prep_Base):
+    def __init__(self, args_use, model, *args, **kwargs):
+        super(NMF_Model, self).__init__(*args, **kwargs)
+        self.Model = NMF(n_components=args_use['n_components'])
+
+        self.n_components = args_use['n_components']
+        self.k = {'n_components':args_use['n_components']}
+        self.Model_Name = 'NFM'
+
+    def Fit(self, x_data,y_data, *args, **kwargs):
+        if not self.have_Fit:  # 不允许第二次训练
+            self.Model.fit(x_data,y_data)
+        return 'None', 'None'
+
+    def Predict(self, x_data):
+        x_Predict = self.Model.transform(x_data)
+        return x_Predict,'NMF'
+
+class TSNE_Model(prep_Base):
+    def __init__(self, args_use, model, *args, **kwargs):
+        super(TSNE_Model, self).__init__(*args, **kwargs)
+        self.Model = TSNE(n_components=args_use['n_components'])
+
+        self.n_components = args_use['n_components']
+        self.k = {'n_components':args_use['n_components']}
+        self.Model_Name = 't-SNE'
+
+    def Fit(self, x_data,y_data, *args, **kwargs):
+        return 'None', 'None'
+
+    def Predict(self, x_data):
+        x_Predict = self.Model.fit_transform(x_data)
+        return x_Predict,'SNE'
+
+class MLP_Model(Study_MachineBase):
+    def __init__(self,args_use,model,*args,**kwargs):#model表示当前选用的模型类型,Alpha针对正则化的参数
+        super(MLP_Model, self).__init__(*args,**kwargs)
+        Model = {'MLP':MLPRegressor,'MLP_class':MLPClassifier}[model]
+        self.Model = Model(hidden_layer_sizes=args_use['hidden_size'],activation=args_use['activation'],
+                           solver=args_use['solver'],alpha=args_use['alpha'],max_iter=args_use['max_iter'])
+        #记录这两个是为了克隆
+        self.hidden_layer_sizes = args_use['hidden_size']
+        self.activation = args_use['activation']
+        self.max_iter = args_use['max_iter']
+        self.solver = args_use['solver']
+        self.alpha = args_use['alpha']
+        self.k = {'hidden_layer_sizes':args_use['hidden_size'],'activation':args_use['activation'],'max_iter':args_use['max_iter'],
+                  'solver':args_use['solver'],'alpha':args_use['alpha']}
+        self.Model_Name = model
+
 class Machine_Learner(Learner):#数据处理者
     def __init__(self,*args, **kwargs):
         super().__init__(*args, **kwargs)
@@ -629,6 +738,10 @@ class Machine_Learner(Learner):#数据处理者
                           'Knn': Knn_Model,
                           'Tree_class': Tree_Model,
                           'Tree': Tree_Model,
+                          'Forest':Forest_Model,
+                          'Forest_class': Forest_Model,
+                          'GradientTree_class':GradientTree_Model,
+                          'GradientTree': GradientTree_Model,
                           'Variance':Variance_Model,
                           'SelectKBest':SelectKBest_Model,
                           'Z-Score':Standardization_Model,
@@ -649,6 +762,12 @@ class Machine_Learner(Learner):#数据处理者
                           'RPCA':RPCA_Model,
                           'KPCA':KPCA_Model,
                           'LDA':LDA_Model,
+                          'SVC':SVC_Model,
+                          'SVR':SVR_Model,
+                          'MLP':MLP_Model,
+                          'MLP_class': MLP_Model,
+                          'NMF':NMF_Model,
+                          't-SNE':TSNE_Model,
                           }
         self.Learner_Type = {}#记录机器的类型
 
@@ -658,14 +777,20 @@ class Machine_Learner(Learner):#数据处理者
         #输入数据
         exec(Text,args)
         #处理数据
-        args_use['alpha'] = float(args.get('alpha',1.0))#L1和L2正则化用
+        if Type in ('MLP','MLP_class'):
+            args_use['alpha'] = float(args.get('alpha', 0.0001))  # MLP正则化用
+        else:
+            args_use['alpha'] = float(args.get('alpha',1.0))#L1和L2正则化用
         args_use['C'] = float(args.get('C', 1.0))  # L1和L2正则化用
-        args_use['max_iter'] = int(args.get('max_iter', 1000))  # L1和L2正则化用
+        if Type in ('MLP','MLP_class'):
+            args_use['max_iter'] = int(args.get('max_iter', 200))  # L1和L2正则化用
+        else:
+            args_use['max_iter'] = int(args.get('max_iter', 1000))  # L1和L2正则化用
         args_use['n_neighbors'] = int(args.get('K_knn', 5))#knn邻居数 (命名不同)
         args_use['p'] = int(args.get('p', 2))  # 距离计算方式
         args_use['nDim_2'] = bool(args.get('nDim_2', True))  # 数据是否降维
 
-        if Type == 'Tree':
+        if Type in ('Tree','Forest','GradientTree'):
             args_use['criterion'] = 'mse' if bool(args.get('is_MSE', True)) else 'mae'  # 是否使用基尼不纯度
         else:
             args_use['criterion'] = 'gini' if bool(args.get('is_Gini', True)) else 'entropy'  # 是否使用基尼不纯度
@@ -693,7 +818,13 @@ class Machine_Learner(Learner):#数据处理者
         args_use['fill_value'] = args.get('fill_value',None)
 
         args_use['n_components'] = args.get('n_components',1)
-        args_use['kernel'] = args.get('kernel','linear')
+        args_use['kernel'] = args.get('kernel','rbf' if Type in ('SVR','SVR') else 'linear')
+
+        args_use['n_Tree'] = args.get('n_Tree',100)
+        args_use['gamma'] = args.get('gamma',1)
+        args_use['hidden_size'] = tuple(args.get('hidden_size',(100,)))
+        args_use['activation'] = str(args.get('activation','relu'))
+        args_use['solver'] = str(args.get('solver','adam'))
         return args_use
 
     def Add_Learner(self,Learner,Text=''):

+ 78 - 9
Machine_learning.py

@@ -229,8 +229,14 @@ def Main():
                                          sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
 
     a_y += 1
-    tkinter.Button(top, bg=bbg, fg=fg, text='LDA', command=Add_LDA, font=FONT, width=width_B, height=height_B).grid(
-        column=a_x, row=a_y,columnspan=3,
+    tkinter.Button(top, bg=bbg, fg=fg, text='LDA降维', command=Add_LDA, font=FONT, width=width_B, height=height_B).grid(
+        column=a_x, row=a_y,
+        sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
+    tkinter.Button(top, bg=bbg, fg=fg, text='NMF降维', command=Add_NMF, font=FONT, width=width_B, height=height_B).grid(
+        column=a_x+1, row=a_y,
+        sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
+    tkinter.Button(top, bg=bbg, fg=fg, text='t-SNE', command=Add_TSNE, font=FONT, width=width_B, height=height_B).grid(
+        column=a_x+2, row=a_y,
         sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
 
     a_y += 1
@@ -248,6 +254,17 @@ def Main():
     tkinter.Button(top, bg=bbg, fg=fg, text='逻辑回归', command=Add_LogisticRegression, font=FONT, width=width_B,
                    height=height_B).grid(column=a_x, row=a_y,
                                          sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
+    tkinter.Button(top, bg=bbg, fg=fg, text='K邻近预测', command=Add_Knn, font=FONT, width=width_B, height=height_B).grid(
+        column=a_x + 1, row=a_y,
+        sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
+    tkinter.Button(top, bg=bbg, fg=fg, text='K邻近分类', command=Add_Knn_Class, font=FONT, width=width_B,
+                   height=height_B).grid(column=a_x + 2, row=a_y,
+                                         sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
+
+    a_y += 1
+    tkinter.Button(top, bg=bbg, fg=fg, text='梯度回归树回归', command=Add_GradientTree, font=FONT, width=width_B,
+                   height=height_B).grid(column=a_x, row=a_y,
+                                         sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
     tkinter.Button(top, bg=bbg, fg=fg, text='决策树回归',command=Add_Tree, font=FONT, width=width_B, height=height_B).grid(
         column=a_x + 1, row=a_y,
         sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
@@ -256,15 +273,34 @@ def Main():
         sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
 
     a_y += 1
-    tkinter.Button(top, bg=bbg, fg=fg, text='朴素贝叶斯', font=FONT, width=width_B, height=height_B).grid(
-        column=a_x, row=a_y,
+    tkinter.Button(top, bg=bbg, fg=fg, text='梯度回归树分类', command=Add_GradientTree_class, font=FONT, width=width_B,
+                   height=height_B).grid(column=a_x, row=a_y,sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
+    tkinter.Button(top, bg=bbg, fg=fg, text='随机森林回归', command=Add_Forest, font=FONT, width=width_B,
+                   height=height_B).grid(column=a_x+1, row=a_y,
+                                         sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
+    tkinter.Button(top, bg=bbg, fg=fg, text='随机森林分类',command=Add_Forest_class, font=FONT, width=width_B, height=height_B).grid(
+        column=a_x + 2, row=a_y,sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
+
+    a_x += 3
+    tkinter.Label(top, text='', bg=bg, fg=fg, font=FONT, width=1).grid(column=a_x, row=a_y)  # 设置说明
+    a_x += 1
+    a_y = 0
+
+    tkinter.Button(top, bg=bbg, fg=fg, text='多层感知机回归', command=Add_MLP, font=FONT, width=width_B,
+                   height=height_B).grid(column=a_x, row=a_y,sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
+    tkinter.Button(top, bg=bbg, fg=fg, text='多层感知机分类', command=Add_MLP_class, font=FONT, width=width_B,
+                   height=height_B).grid(column=a_x+1, row=a_y,
+                                         sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
+    tkinter.Button(top, bg=bbg, fg=fg, text='随机森林分类',command=Add_Forest_class, font=FONT, width=width_B, height=height_B).grid(
+        column=a_x + 2, row=a_y,sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
+
+    a_y += 1
+    tkinter.Button(top, bg=bbg, fg=fg, text='支持向量机分类:SVC', command=Add_SVC, font=FONT, width=width_B, height=height_B).grid(
+        column=a_x, row=a_y,columnspan=2,
         sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
-    tkinter.Button(top, bg=bbg, fg=fg, text='K邻近预测', command=Add_Knn, font=FONT, width=width_B, height=height_B).grid(
-        column=a_x + 1, row=a_y,
+    tkinter.Button(top, bg=bbg, fg=fg, text='回归:SVR', command=Add_SVR, font=FONT, width=width_B, height=height_B).grid(
+        column=a_x + 2, row=a_y,
         sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
-    tkinter.Button(top, bg=bbg, fg=fg, text='K邻近分类', command=Add_Knn_Class, font=FONT, width=width_B,
-                   height=height_B).grid(column=a_x + 2, row=a_y,
-                                         sticky=tkinter.E + tkinter.W + tkinter.W + tkinter.S + tkinter.N)
 
     a_x += 3
     tkinter.Label(top, text='', bg=bg, fg=fg, font=FONT, width=1).grid(column=a_x, row=a_y)  # 设置说明
@@ -368,6 +404,33 @@ def get_Learner(Type=False):
         except:
             return None
 
+def Add_MLP_class():
+    Add_leaner('MLP_class')
+
+def Add_MLP():
+    Add_leaner('MLP')
+
+def Add_SVR():
+    Add_leaner('SVR')
+
+def Add_SVC():
+    Add_leaner('SVC')
+
+def Add_GradientTree():
+    Add_leaner('GradientTree')
+
+def Add_GradientTree_class():
+    Add_leaner('GradientTree_class')
+
+# def Add_NMF():
+#     Add_leaner('NMF')
+
+def Add_TSNE():
+    Add_leaner('t-SNE')
+
+def Add_NMF():
+    Add_leaner('NMF')
+
 def Add_LDA():
     Add_leaner('LDA')
 
@@ -422,6 +485,12 @@ def Add_MinMaxScaler():
 def Add_Z_Score():
     Add_leaner('Z-Score')
 
+def Add_Forest():
+    Add_leaner('Forest')
+
+def Add_Forest_class():
+    Add_leaner('Forest_class')
+
 def Add_Tree_Class():
     Add_leaner('Tree_class')