# -*- coding: utf-8 -*-
"""
Created on Thu Jun 14 21:33:52 2018
@author: wrm
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
iris = sns.load_dataset("iris")
"""
iris dataset直接就是一个pandas DataFrame,pandas是做机器学习和数据挖掘的
一个十分强大的工具。可以参考Wes McKinney的那本书:https://blog.csdn.net/cf406061841/article/details/71911346
"""
"""
此处是非常著名的groupby()命令。可以按照其中的某个feature去groupby然后显示出其中的
一些特征,比如均值mean(),数个数count(),以及求和sum()
"""
#print iris.head()
#print iris.groupby("species").count()
#print iris.groupby("species").mean()
#print iris.groupby("species").sum()
"""
你也可以试一下下面的这个命令!可以帮助你理解。个人认为在pandas的基础操作里
Groupby()是比较难掌握和理解的一个命令。
"""
#print iris.groupby("sepal_length").sum()
#print iris
"""
在这个地方先输出iris进行测试。写代码的时候一边写一边测试是一
个好习惯,反正我是这么做的。
"""
"""
在这里我们提取data和label。当然了,方法并非只有这一种。
"""
data = iris[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']].values
labels = np.array([i//50 for i in range(iris.shape[0])])
#print data
#print labels
"""
在机器学习里我们一般是有三个集合:训练集合(用数据去训练算法),提升集合(优化算法
里的参数)以及测试集合(测试你的结果)。
在这个问题里我们对这一套进行简化。直接分为两个数据集合,训练集合和测试集合。
其实在很多时候,在工业界我们也是利用这样的方法。
在原始数据集合中分别选取一部分数据做训练,另一部分数据来做测试。
在这里我们所用的方法是Cross-validation(CV,这个词在计算机科学里
还有一个意思是计算机科学,computer vision).
https://baike.baidu.com/item/%E4%BA%A4%E5%8F%89%E9%AA%8C%E8%AF%81/8543100?fr=aladdin
一般来说选取集合有两种方法,第一个是人为规定,第二个是用CV。
你们要用CV,不要用人工选取集合,simply because that is clumsy.
"""
from sklearn import cross_validation
"""
一般情况下所有的import都写在开头
"""
frac =0.4
d_train, d_test, l_train, l_test= cross_validation.train_test_split(data, labels, test_size=frac, random_state=0)
#print ("d_train,",d_train)
#print ("l_train,",l_train)
"""
下面是KNN算法
注意:KNN非常容易和K-means搞混,而这完全是两种不同的方法
"""
from sklearn import neighbors
nbrs=5
knn=neighbors.KNeighborsClassifier(n_neighbors=5)
knn.fit(d_train, l_train)
# Finally, we test our model
result = knn.predict(d_test)
print ("使用这种方法得到的准确率",knn.score(d_test,l_test))
#print ("Here comes the result for KNN")
#print (list(result))
#print list(l_test)
"""
下面是SVM算法
SVM适合classification,对于比较高维度的情况要用kernel!
"""
from sklearn import svm
clf = svm.SVC(kernel='linear', C=1).fit(d_train, l_train)
result = clf.predict(d_test)
print ("使用这种方法得到的准确率",clf.score(d_test,l_test))
"""
下面是DecisionTree算法
"""
from sklearn import tree
# Lets build our model and train it all at once
dtc = tree.DecisionTreeClassifier().fit(d_train, l_train)
# Now grab the predictions
result = dtc.predict(d_test)
print("使用这种方法得到的准确率",dtc.score(d_test, l_test))
"""
下面是RandomForest算法
"""
from sklearn.ensemble import RandomForestClassifier
# Lets build our model and train it all at once
rfc = RandomForestClassifier(n_estimators=10, max_depth=None,min_samples_split=2, random_state=0)
rfc.fit(d_train, l_train)
# Now grab the predictions
result = rfc.predict(d_test)
print("使用这种方法得到的准确率",rfc.score(d_test, l_test))
"""
我们可以求解一下他的cross_val_score
"""
svm_scores = cross_validation.cross_val_score(clf, data, labels, cv=5)
rfc_scores = cross_validation.cross_val_score(rfc, data, labels, cv=10)
print ("CLF CV Scores", svm_scores)
print ("RFC CV Scores", rfc_scores)
"""
使用PCA降维方法,得到两个最重要的vector:
"""
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(data)
data_reduced = pca.transform(data)
#print (data_reduced)
cols = ['PCA1', 'PCA2', 'Species']
tmp_d = np.concatenate((data_reduced, iris['species'].reshape((150, 1))), axis=1)
iris_pca = pd.DataFrame(tmp_d, columns = cols)