在把資料用於機器學習的演算法之前,必須認真準備資料。提供類別分布一致的訓練集和測試集對於成功的分類模型是十分重要的。繼續使用iris資料集,把80%的記錄歸入訓練集,剩下的20%作為測試集。
#匯入必要的庫
from sklearn.datasets import load_iris
import numpy as np
from sklearn.cross_validation import train_test_split
#載入iris資料集
defget_iris_data
(): data = load_iris()
x = data['data']#例項
y = data['target']#類別標籤
input_dataset = np.column_stack([x, y])#列合併——類別標籤和例項
np.random.shuffle(input_dataset)#把資料打亂,使得記錄能隨機地分布到訓練集和測試集中
return input_dataset
#列印原始資料集及分割的訓練集和測試集資訊
defprint_data
(input_dataset):
train_size = 0.80
#80%作為訓練集
test_size = 1 - train_size#20%作為測試集
input_dataset = get_iris_data()
train, test = train_test_split(input_dataset, train_size=train_size)
print('compare data set size')
print('*************************=')
print('original dataset size: {}'.format(input_dataset.shape))
print('train size: {}'.format(train.shape))
print('test size: {}'.format(test.shape))
return train, test, test_size
#定義get_class_distribution函式,它採用y的類別標籤作為引數,返回乙個字典,鍵是類別標籤,值是這類記錄數占總數的百分比分布。返回類別標籤的分布情況。在隨後的函式裡呼叫這個函式,就可以了解訓練集和測試集裡的類別分布。
defget_class_distribution
(y):
d = {}
set_y = set(y)
for y_label in set_y:
no_elements = len(np.where(y == y_label)[0])
d[y_label] = no_elements
dist_percentage =
return dist_percentage
#定義print_class_label_split函式,把訓練集和測試集作為引數。
defprint_class_label_split
(train, test):
#列印訓練集類別分布
y_train = train[:,-1]
train_distribution = get_class_distribution(y_train)
print('\n train data set class label distribution')
for k, v in train_distribution.items():
print('class label = %d, percentage records = %.2f)'%(k, v))
#列印測試集類別分布
y_test = test[:,-1]
test_distribution = get_class_distribution(y_test)
print('\n test data set class label distribution')
for k, v in test_distribution.items():
print('class label = %d, percentage records = %.2f)'%(k, v))
if __name__ == '__main__':
train, test = print_data(input_dataset=get_iris_data())
print_class_label_split(train, test)
輸出:
compare data set size
*************************=
original dataset size: (150, 5)
train size: (120, 5)
test size: (30, 5)
train data set
class
label distribution
class
label = 0, percentage records = 0.33)
class
label = 1, percentage records = 0.35)
class
label = 2, percentage records = 0.32)
test data set
class
label distribution
class
label = 0, percentage records = 0.33)
class
label = 1, percentage records = 0.27)
class
label = 2, percentage records = 0.40)
結果分析:仔細看看這個結果,會發現訓練集的類別標籤分布和測試集的並不一致,測試集剛剛有40%的例項屬於類別2,而訓練集有32%的例項屬於類別2。這說明我們之前的資料分割方式不太合適,因為訓練集和測試集裡的列別分布本應該是一致的。
接下來我們來看看如何在訓練集和測試集裡均勻地分布類別標籤:
if __name__ == '__main__':
from sklearn.cross_validation import stratifiedshufflesplit#導入庫
input_dataset = get_iris_data()
train, test, test_size = print_data(input_dataset)
print_class_label_split(train, test)
stratified_split = stratifiedshufflesplit(input_dataset[:,-1],test_size=test_size)#呼叫sklearn裡的stratifiedshufflesplit函式。第乙個引數是輸入的資料集;第二個引數test_size定義了測試集的大小;第三個引數n_iter定義了只進行一次分割。
for train_indx,test_indx in stratified_split:
train = input_dataset[train_indx]
test = input_dataset[test_indx]
print_class_label_split(train, test)
輸出:
train data set
class
label distribution
class
label = 0, percentage records = 0.33)
class
label = 1, percentage records = 0.33)
class
label = 2, percentage records = 0.33)
test data set
class
label distribution
class
label = 0, percentage records = 0.33)
class
label = 1, percentage records = 0.33)
class
label = 2, percentage records = 0.33)
現在訓練集和測試集的類別分布是一致的了! Python那些事兒 資料放縮
討論如何對資料進行放縮 import numpy as np np.random.seed 10 x np.random.randomint 10,25 1.0 for i in range 10 defmin max x return round round xx min x 1.0 max x ...
關於Python那些事兒
1.易於學習 python有相對較少的關鍵字,結構簡單,和乙個明確定義的語法,學習起來更加簡單。2.易於閱讀 python 定義的更清晰。3.易於維護 python的成功在於它的源 是相當容易維護的。4.乙個廣泛的標準庫 python的最大的優勢之一是豐富的庫,跨平台的,在unix,windows和...
python那些事兒pdf Python 那些事兒
python datatype 好久沒用,完了不少,寫個複習筆記以供以後使用 python 最基本的資料是序列,序列的基本特點就是可以索引,但是要記住python的index同c一樣,是從0開始的。序列的基本操作包括 indexing 索引 sliceing 分片 interation 迭代 以及a...