1. 程式人生 > >《python資料探勘入門與實踐》筆記1

《python資料探勘入門與實踐》筆記1

1.匯入iris植物資料集,包含150個sample。X是一個4元組,包含特徵:sepal length、 sepal width、 petal length、 petal width。Y是每個sample的分類情況,分類有三種情況(0,1,2)表示。

from sklearn.datasets import load_iris
dataset=load_iris()
X=dataset.data
Y=dataset.target

2.將連續的資料離散化。以平均值做閾值。

attribute_mean= X.mean(axis=0)
X_d=np.array(X>=attribute_mean,dtype=’int’)

from collections import defaultdict
from operator import itemgetter

3.實現OneR演算法。
X是特徵集,y_ture是分類資訊,feature_index表示用第幾個特徵來分類,value表示特徵值。(zip()函式:將兩個元組一一對應)
train_feature_value函式統計了y類中第feature_index個特徵值為value的sample個數

def train_feature_value(X,y_true,feature_index,value):
class_counts=defaultdict(int)
for sample ,y in zip(X,y_true):
if sample[feature_index]==value:
class_counts[y]+=1

對統計結果進行排序,找到最大的值,就能找到在給定特徵值下,哪個類的出現次數最多。然後計算錯誤率,並將這兩個值返回。

sorted_class_counts=sorted(class_counts.items(),key=itemgetter(1),reverse=True)
most_frequent_class=sorted_class_counts[0][0]
incorrect_predictions=[class_count for class_value,class_count in class_counts.items() if class_value!=most_frequent_class]
error=sum(incorrect_predictions)
return most_frequent_class,error

4.values是將X的集合中第feature_index列的值選出來,該例子只可能是0和1.
def train_on_feature(X,y_true,feature_index):
values=set(X[:,feature_index])
predictors={}
errors=[]
for current_value in values:
most_frequent_class, error = train_feature_value(X,y_true, feature_index, current_value)
predictors[current_value] = most_frequent_class
errors.append(error)
total_error = sum(errors)
return predictors, total_error

5.匯入包,來分割訓練集合和測試集合。
from sklearn.cross_validation import train_test_split
Xd_train,Xd_test,y_train,y_test=train_test_split(X_d,Y,random_state=14)
all_predictors={}
errors={}

(.shape[1]表示求Xd_train元組的第1行的長度,求出結果是4)
for feature_index in range(Xd_train.shape[1]):
#print(Xd_train)
predictors,total_error=train_on_feature(Xd_train,y_train,feature_index)
all_predictors[feature_index]=predictors
errors[feature_index]=total_error
best_feature,best_error=sorted(errors.items(),key=itemgetter(1))[0]
print(all_predictors,errors)

將訓練集的結果寫成一個model字典,用在下面的測試集上。
model={‘feature’:best_feature,’predictor’:all_predictors[best_feature][0]}

def predict(Xd_test,model):
variable = model[‘feature’](和書中不一樣,書裡寫的是variable = model[‘variable’]。但是自己理解上這引數應該是feature)
predictor = model[‘predictor’]
#for sample in Xd_test:
print(Xd_test,y_test)
y_predicted = np.array([int(predictor!=sample[variable]) for sample in Xd_test])
(書上是y_predicted = np.array([predictor[int(sample[variable])] for sample in X_test]),但是程式碼報錯。predictor是一個整數,求索引會報錯。 這裡我按自己理解的演算法改寫了程式碼。)
#print(sample)
# y_predicted =0
return y_predicted
y_predicted = predict(Xd_test, model)
accuracy = np.mean(y_predicted == y_test) * 100
print(y_predicted)
print(“The test accuracy is {:.1f}%”.format(accuracy))

最後求出來的結果是The test accuracy is 76.3%。和書中給的68%有所差別。

總結:python一行式程式碼與之前學習的程式碼有所不同,得花時間再學習。自己修改的程式碼不知道對錯,造成結果不同的原因未知。猜測可能是將資料集隨機分類造成的。