官方示例 1 2 3 4 5 6 7 >>> import numpy as np>>> from sklearn import datasets>>> iris = datasets.load_iris()>>> iris_X = iris.data >>> iris_y = iris.target >>> np.unique(iris_y)array([0 , 1 , 2 ])
读出sk-learn自带的数据集
1 2 3 4 5 6 7 8 9 10 >>> np.random.seed(0 )>>> indices = np.random.permutation(len(iris_X))>>> iris_X_train = iris_X[indices[:-10 ]]>>> iris_y_train = iris_y[indices[:-10 ]]>>> iris_X_test = iris_X[indices[-10 :]]>>> iris_y_test = iris_y[indices[-10 :]]>>> len(iris_X_train)140
先把数据打乱,再把形状数据和类别数据分别切成训练集和测试集。事实上iris数据集共有150条数据,我们取140条作为训练集,10条作为测试集。
1 2 3 4 5 6 >>> from sklearn.neighbors import KNeighborsClassifier>>> knn = KNeighborsClassifier()>>> knn.fit(iris_X_train, iris_y_train) >>> knn.predict(iris_X_test)array([1 , 2 , 1 , 0 , 0 , 0 , 2 , 1 , 2 , 0 ])
就这么轻巧的预测结果就出来了,简单的令人发指。
一些思考 1 2 3 >>> import matplotlib.pyplot as plt >>> plt.plot(iris_X_train)>>> plt.show()
我想直观的看一下这组数据究竟长什么样,直接plot的话结果是这样的,于是我想让他在坐标系里显示,为此,需要去掉一个维度。
1 2 3 4 5 6 7 8 >>> import pandas as pd>>> import matplotlib.pyplot as plt>>> iris_X_train_1 = pd.DataFrame(iris_X_train)>>> iris_Y_train_1 = pd.DataFrame(iris_y_train)>>> iris_X_test_1 = pd.DataFrame(iris_X_test)>>> iris_Y_test_1 = pd.DataFrame(iris_y_test)>>> iris_X_train_1.head()
转换成DataFrame格式其实最主要是为了执行删除列的操作。
1 2 3 >>> iris_X_train_2 = iris_X_train_1.drop([3 ],axis=1 ) >>> iris_X_test_2 = iris_X_test_1.drop([3 ],axis=1 )>>> iris_X_train_2.iloc[:,0 ].values
使用drop和iloc函数分别对数组进行删除列和提取列的操作。顺便把df变回array加上.value就行了。
1 2 >>> cValue = iris_Y_train_1cValue.replace({0 :'r' ,1 :'g' ,2 :'b' }).values
X是花蕊的性状,Y是花蕊的分类。
1 2 3 4 5 >>> from mpl_toolkits.mplot3d import Axes3D >>> fig = plt.figure()>>> ax = fig.add_subplot(111 , projection='3d' ) >>> ax.scatter(iris_X_train_2.iloc[:,0 ].values,iris_X_train_2.iloc[:,1 ].values,iris_X_train_2.iloc[:,2 ].values,c=cValue.values) >>> plt.show()
这个好像被叫做特征空间都东西就出来了。我们可以看见被分类为三种不同类型的花蕊,他们的特征的空间。他们的边缘有一些交错,这可能会带来误差。
1 2 3 >>> knn = KNeighborsClassifier()>>> knn.fit(iris_X_train_2, iris_Y_train_1) >>> predict = knn.predict(iris_X_test_2)
这里重复之前的步骤,直接调用knn的包,把预测结果赋给predict。
1 2 3 4 5 6 7 8 9 10 def accuricy (test_y,predict) : same=0 for i in range(0 ,len(test_y)): a = test_y[i] b = predict[i] if a==b: same+=1 return same*100 / len(test_y)
一个简单的计算学习精度的函数。
1 2 >> > accuricy(iris_y_test,predict)90
这里我们可以发现即使这组数据去掉第四个特征,也能达到同样的学习性能(90%)。通过比较,我发现在去掉第一个特征的情况下,能达到100%的精度。 这里我是手动的删掉某一个特征,好像有一些算法可以科学的降低维度,如我最近在论文里读到的二元主成分分析,这也是我今后要学习的。