In [1]:
from sklearn.datasets import load_iris
iris = load_iris()
# create X(features) and y(response)
X = iris.data
y = iris.target
In [2]:
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
logreg.fit(X, y)
y_pred = logreg.predict(X)
print "predicted response:\n",y_pred
In [3]:
len(y_pred)
Out[3]:
In [4]:
from sklearn import metrics
print metrics.accuracy_score(y, y_pred)
以上说明对于训练的数据,我们有96%的数据预测正确。这里我们使用相同的数据来训练和预测,使用的度量称其为训练准确度。
In [5]:
from sklearn.neighbors import KNeighborsClassifier
knn5 = KNeighborsClassifier(n_neighbors=5)
knn5.fit(X, y)
y_pred = knn5.predict(X)
print metrics.accuracy_score(y, y_pred)
In [6]:
knn1 = KNeighborsClassifier(n_neighbors=1)
knn1.fit(X, y)
y_pred = knn1.predict(X)
print metrics.accuracy_score(y, y_pred)
上面我们得到了训练准确度为100%的模型,貌似得到了最好的模型和参数。但我们回想一下KNN算法的原理,KNN算法寻找训练数据中的K个最近的数据,它使用指向最多的那个类别来作为预测的输出。
这下我们就明白了为什么当K=1的时候KNN算法的训练准确度为1,KNN会查找在训练数据集中的最近的观测,训练得到的模型会在相同的数据集中找到相同的观测。换句话说,KNN算法已经记住了训练数据集,因为我们使用同样的数据作为测试的数据。
In [7]:
print X.shape
print y.shape
In [22]:
# 第一步:将X和y分割成训练和测试集
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=4)
# 这里的random_state参数根据给定的给定的整数,得到伪随机生成器的随机采样
这里测试数据的大小没有统一的标准,一般选择数据集的20%-40%作为测试数据。
In [9]:
print X_train.shape
print X_test.shape
In [10]:
print y_train.shape
print y_test.shape
In [11]:
# 第二步:使用训练数据训练模型
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
Out[11]:
In [12]:
# 第三步: 针对测试数据进行预测,并得到测试准确率
y_pred = logreg.predict(X_test)
print metrics.accuracy_score(y_test, y_pred)
# 可以尝试一下,对于上面不同数据集分割,得到的测试准确率不同
In [13]:
# K=5
knn5 = KNeighborsClassifier(n_neighbors=5)
knn5.fit(X_train, y_train)
y_pred = knn5.predict(X_test)
print metrics.accuracy_score(y_test, y_pred)
In [14]:
# K=1
knn1 = KNeighborsClassifier(n_neighbors=1)
knn1.fit(X_train, y_train)
y_pred = knn1.predict(X_test)
print metrics.accuracy_score(y_test, y_pred)
我们能找到一个比较好的K值吗?
In [15]:
# 测试从K=1到K=25,记录测试准确率
k_range = range(1, 26)
test_accuracy = []
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
test_accuracy.append(metrics.accuracy_score(y_test, y_pred))
In [16]:
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(k_range, test_accuracy)
plt.xlabel("Value of K for KNN")
plt.ylabel("Testing Accuracy")
Out[16]:
In [17]:
# 这里我们对未知数据进行预测
knn11 = KNeighborsClassifier(n_neighbors=11)
knn11.fit(X, y)
knn11.predict([3, 5, 4, 2])
Out[17]:
In [18]:
from sklearn.cross_validation import KFold
import numpy as np
def cv_estimate(k, kfold=5):
cv = KFold(n = X.shape[0], n_folds=kfold)
clf = KNeighborsClassifier(n_neighbors=k)
score = 0
for train, test in cv:
clf.fit(X[train], y[train])
score += clf.score(X[test], y[test])
#print clf.score(X[test], y[test])
score /= kfold
return score
In [19]:
# 测试从K=1到K=25,记录测试准确率
k_range = range(1, 26)
test_accuracy = []
for k in k_range:
test_accuracy.append(cv_estimate(k, 5))
In [20]:
print test_accuracy
In [21]:
plt.plot(k_range, test_accuracy)
plt.xlabel("Value of K for KNN")
plt.ylabel("Average Accuracy of Kfold CV")
Out[21]: