import os
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn import preprocessing
from sklearn import neighbors
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn import svm
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from time import time
from sklearn.naive_bayes import MultinomialNB
from sklearn import tree
from sklearn.ensemble import GradientBoostingClassifier
def getData_1():
iris = datasets.load_iris()
X = iris.data
y = iris.target
def getData_2():
fPath = 'D:\分类算法\binary_classify_data.txt'
if os.path.exists(fPath):
data = pd.read_csv(fPath,header=None,skiprows=1,names=['class0','pixel0','pixel1','pixel2','pixel3'])
X_train1, X_test1, y_train1, y_test1 = train_test_split(data, data['class0'], test_size = 0.4, random_state = 0)
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(np.array(X_train1))
X_test_minmax = min_max_scaler.fit_transform(np.array(X_test1))
return (X_train_minmax, np.array(y_train1), X_test_minmax, np.array(y_test1))
else:
print ('No such file or directory!')
def getData_3():
fPath = 'D:\\分类算法\\binary_classify_data.txt'
if os.path.exists(fPath):
dataMatrix = np.array(pd.read_csv(fPath,header=None,skiprows=1,names=['class0','pixel0','pixel1','pixel2','pixel3']))
rowNum, colNum = dataMatrix.shape[0], dataMatrix.shape[1]
sampleData = []
sampleClass = []
for i in range(0, rowNum):
tempList = list(dataMatrix[i,:])
sampleClass.append(tempList[0])
sampleData.append(tempList[1:])
sampleM = np.array(sampleData)
classM = np.array(sampleClass)
skf = StratifiedKFold(n_splits = 10)
setDict = {}
count = 1
for trainI, testI in skf.split(sampleM, classM):
trainSTemp = []
trainCTemp = []
testSTemp = []
testCTemp = []
trainIndex = list(trainI)
for t1 in range(0, len(trainIndex)):
trainNum = trainIndex[t1]
trainSTemp.append(list(sampleM[trainNum, :]))
trainCTemp.append(list(classM)[trainNum])
setDict[str(count) + 'train'] = np.array(trainSTemp)
setDict[str(count) + 'trainclass'] = np.array(trainCTemp)
testIndex = list(testI)
for t2 in range(0, len(testIndex)):
testNum = testIndex[t2]
testSTemp.append(list(sampleM[testNum, :]))
testCTemp.append(list(classM)[testNum])
setDict[str(count) + 'test'] = np.array(testSTemp)
setDict[str(count) + 'testclass'] = np.array(testCTemp)
count += 1
return setDict
else:
print ('No such file or directory!')
def KNN():
clf = neighbors.KNeighborsClassifier()
return clf
def LDA():
clf = LinearDiscriminantAnalysis()
return clf
def SVM():
clf = svm.SVC()
return clf
def LR():
clf = LogisticRegression()
return clf
def RF():
clf = RandomForestClassifier()
return clf
def native_bayes_classifier():
clf = MultinomialNB(alpha = 0.01)
return clf
def decision_tree_classifier():
clf = tree.DecisionTreeClassifier()
return clf
def gradient_boosting_classifier():
clf = GradientBoostingClassifier(n_estimators = 200)
return clf
def getRecognitionRate(testPre, testClass):
testNum = len(testPre)
rightNum = 0
for i in range(0, testNum):
if testClass[i] == testPre[i]:
rightNum += 1
return float(rightNum) / float(testNum)
def report(results, n_top=5488):
f = open('F:/grid_search_rf.txt', 'w')
for i in range(1, n_top + 1):
candidates = np.flatnonzero(results['rank_test_score'] == i)
for candidate in candidates:
f.write("Model with rank: {0}".format(i) + '\n')
f.write("Mean validation score: {0:.3f} (std: {1:.3f})".format(
results['mean_test_score'][candidate],
results['std_test_score'][candidate]) + '\n')
f.write("Parameters: {0}".format(results['params'][candidate]) + '\n')
f.write("\n")
f.close()
def selectRFParam():
clf_RF = RF()
param_grid = {"max_depth": [3,15],
"min_samples_split": [3, 5, 10],
"min_samples_leaf": [3, 5, 10],
"bootstrap": [True, False],
"criterion": ["gini", "entropy"],
"n_estimators": range(10,50,10)}
grid_search = GridSearchCV(clf_RF, param_grid=param_grid, n_jobs=4)
start = time()
T = getData_2()
grid_search.fit(T[0], T[1])
print("GridSearchCV took %.2f seconds for %d candidate parameter settings."
% (time() - start, len(grid_search.cv_results_['params'])))
report(grid_search.cv_results_)
def totalAlgorithm_1():
clf_KNN = KNN()
clf_LDA = LDA()
clf_SVM = SVM()
clf_LR = LR()
clf_RF = RF()
clf_NBC = native_bayes_classifier()
clf_DTC = decision_tree_classifier()
clf_GBDT = gradient_boosting_classifier()
setDict = getData_3()
setNums = len(setDict.keys()) / 4
KNN_rate = 0.0
LDA_rate = 0.0
SVM_rate = 0.0
LR_rate = 0.0
RF_rate = 0.0
NBC_rate = 0.0
DTC_rate = 0.0
GBDT_rate = 0.0
for i in range(1, int(setNums + 1)):
trainMatrix = setDict[str(i) + 'train']
trainClass = setDict[str(i) + 'trainclass']
testMatrix = setDict[str(i) + 'test']
testClass = setDict[str(i) + 'testclass']
clf_KNN.fit(trainMatrix, trainClass)
clf_LDA.fit(trainMatrix, trainClass)
clf_SVM.fit(trainMatrix, trainClass)
clf_LR.fit(trainMatrix, trainClass)
clf_RF.fit(trainMatrix, trainClass)
clf_NBC.fit(trainMatrix, trainClass)
clf_DTC.fit(trainMatrix, trainClass)
clf_GBDT.fit(trainMatrix, trainClass)
KNN_rate += getRecognitionRate(clf_KNN.predict(testMatrix), testClass)
LDA_rate += getRecognitionRate(clf_LDA.predict(testMatrix), testClass)
SVM_rate += getRecognitionRate(clf_SVM.predict(testMatrix), testClass)
LR_rate += getRecognitionRate(clf_LR.predict(testMatrix), testClass)
RF_rate += getRecognitionRate(clf_RF.predict(testMatrix), testClass)
NBC_rate += getRecognitionRate(clf_NBC.predict(testMatrix), testClass)
DTC_rate += getRecognitionRate(clf_DTC.predict(testMatrix), testClass)
GBDT_rate += getRecognitionRate(clf_GBDT.predict(testMatrix), testClass)
print
print
print
print('K Nearest Neighbor mean recognition rate: ', KNN_rate / float(setNums))
print('Linear Discriminant Analysis mean recognition rate: ', LDA_rate / float(setNums))
print('Support Vector Machine mean recognition rate: ', SVM_rate / float(setNums))
print('Logistic Regression mean recognition rate: ', LR_rate / float(setNums))
print('Random Forest mean recognition rate: ', RF_rate / float(setNums))
print('Native Bayes Classifier mean recognition rate: ', NBC_rate / float(setNums))
print('Decision Tree Classifier mean recognition rate: ', DTC_rate / float(setNums))
print('Gradient Boosting Decision Tree mean recognition rate: ', GBDT_rate / float(setNums))
def totalAlgorithm_2():
clf_KNN = KNN()
clf_LDA = LDA()
clf_SVM = SVM()
clf_LR = LR()
clf_RF = RF()
clf_NBC = native_bayes_classifier()
clf_DTC = decision_tree_classifier()
clf_GBDT = gradient_boosting_classifier()
T = getData_2()
trainMatrix, trainClass, testMatrix, testClass = T[0], T[1], T[2], T[3]
clf_KNN.fit(trainMatrix, trainClass)
clf_LDA.fit(trainMatrix, trainClass)
clf_SVM.fit(trainMatrix, trainClass)
clf_LR.fit(trainMatrix, trainClass)
clf_RF.fit(trainMatrix, trainClass)
clf_NBC.fit(trainMatrix, trainClass)
clf_DTC.fit(trainMatrix, trainClass)
clf_GBDT.fit(trainMatrix, trainClass)
print('K Nearest Neighbor recognition rate: ', getRecognitionRate(clf_KNN.predict(testMatrix), testClass))
print('Linear Discriminant Analysis recognition rate: ', getRecognitionRate(clf_LDA.predict(testMatrix), testClass))
print('Support Vector Machine recognition rate: ', getRecognitionRate(clf_SVM.predict(testMatrix), testClass))
print('Logistic Regression recognition rate: ', getRecognitionRate(clf_LR.predict(testMatrix), testClass))
print('Random Forest recognition rate: ', getRecognitionRate(clf_RF.predict(testMatrix), testClass))
print('Native Bayes Classifier recognition rate: ', getRecognitionRate(clf_NBC.predict(testMatrix), testClass))
print('Decision Tree Classifier recognition rate: ', getRecognitionRate(clf_DTC.predict(testMatrix), testClass))
print('Gradient Boosting Decision Tree recognition rate: ', getRecognitionRate(clf_GBDT.predict(testMatrix), testClass))
if __name__ == '__main__':
print('K个训练集和测试集的平均识别率')
totalAlgorithm_1()
print('每类前x%训练,剩余测试,各个模型的识别率')
totalAlgorithm_2()
selectRFParam()
print('随机森林参数调优完成!')