从零开始数据科学与机器学习算法-数据预处理与基准模型-01
讀取數據函數
from csv import reader # 導入庫 def read_csv(the_name_of_file_to_be_read): # 定義數據讀取函數file = open(the_name_of_file_to_be_read,"r")#要讀取的文件的名稱every_line_of_the_data = reader(file) # 讀取每一行數據the_dataseet = list(every_line_of_the_data) # 把每一行數據放到該列表中return the_dataseet # 返回處理后的數據 the_name_of_file_to_be_read = "diabetes-NAN.csv" # 數據文件 dataset = read_csv(the_name_of_file_to_be_read) # 讀取數據 print(dataset) # 打印數據數據缺失先判斷在放入
from csv import reader# 導入庫 def read_csv(the_name_of_file_to_be_read): # 定義數據讀取函數dataset = list()# 定義一個空列表with open(the_name_of_file_to_be_read,"r") as file: # 文件讀取csv_reader = reader(file) # 讀取for row in csv_reader: # 循環(huán)文件內容逐行判斷if not row: # 如果不存在就跳過continue # continue的作用:用來結束本次循環(huán),緊接著執(zhí)行下一次的循環(huán)dataset.append(row) # 把讀取的內容追加到上面定義的空列表中return dataset # 返回列表 the_name_of_file_to_be_read = "diabetes-NAN.csv" # 數據文件 dataset = read_csv(the_name_of_file_to_be_read) # 讀取數據 print(dataset) # 打印數據數據類型強調與轉換
# 列子 dataset = [[1,2],[3,4]]for i in dataset:# 循環(huán)列表print(i) # [1, 2] # [3, 4] for i in dataset[0]: # 循環(huán)列表中第一行print(i) # 1 # 2 for i in range(len(dataset[0])): # 循環(huán)列表中第一行的長度print(i) # 0 # 1 dataset = [[1,2],[3,4],[5,6],[7,8]] for i in range(len(dataset[0])): # 安照列表中第一行的長度進行循環(huán)col_values = [row[i] for row in dataset] # 對每列中的數據進行循環(huán)print(col_values) #[1, 3, 5, 7] #[2, 4, 6, 8] from csv import reader# 導入庫 def read_csv(the_name_of_file_to_be_read): # 定義數據讀取函數dataset = list()# 定義一個空列表with open(the_name_of_file_to_be_read,"r") as file: # 文件讀取csv_reader = reader(file) # 讀取for row in csv_reader: # 循環(huán)文件內容逐行判斷if not row: # 如果不存在就跳過continue # continue的作用:用來結束本次循環(huán),緊接著執(zhí)行下一次的循環(huán)dataset.append(row) # 把讀取的內容追加到上面定義的空列表中return dataset # 返回列表 def conver_string_to_float(dataset,column): # 字符串轉數字函數dataset = dataset[1:] # 列表切分 保留列表索引1至最后一行for row in dataset: # 循環(huán)數據集row[column]=float(row[column].strip()) # 對每一行中每一列進行變化為浮點類型,去掉空格 the_name_of_file_to_be_read = "diabetes-NAN.csv" # 數據文件 dataset = read_csv(the_name_of_file_to_be_read) # 讀取數據 for i in range(len(dataset[0])):# 取出一行的長度進行循環(huán)conver_string_to_float(dataset,i)# 調用字符串轉數字函數 print(dataset)# 打印特征縮放
最大最小歸一化,平均歸一化有一個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義。
通過函數找出每列中最大最小值列子
dataset = [[1,2,3],[4,5,6]] # 編寫函數:在數據集中找到最大值和最小值 def find_the_max_and_min_in_the_dataset(dataset): max_and_min=list() # 定義一個空列表for i in range(len(dataset[0])): # 安照列表中第一行的長度進行循環(huán)col_values = [row[i] for row in dataset] # 對每列中的數據進行循環(huán)value_max = max(col_values)# 取出每列中最大值value_min = min(col_values) #最小值max_and_min.append([value_max,value_min]) # 追加return max_and_min max_and_min = find_the_max_and_min_in_the_dataset(dataset) # 調用函數帶入數據 print(max_and_min) # 打印每一列中最大值和最小值最大最小值歸一化
Min-Max Normalization
?公式:? x’ = (x - X_min) / (X_max - X_min)
列子
代碼
平均歸一化
公式:? x’ = (x - μ) / (MaxValue - MinValue)
列子
代碼
標準化
列子:
dataset = [[1,2,3],[3,4,5],[5,6,7],[7,8,9],[81,96,100]] # 每列平均值 for i in range(len(dataset[0])): col_values = [row[i] for row in dataset] print(sum(col_values)/len(dataset)) a = sqrt((((1-19.4)**2)+((3-19.4)**2)+((5-19.4)**2)+((7-19.4)**2)+((81-19.4)**2))/4) a (1-19.4)/a (3-19.4)/a
代碼:
在kaggle數據集上使用特征縮放
from csv import reader# 導入庫 from math import sqrt數據讀取預處理
def read_csv(the_name_of_file_to_be_read): # 定義數據讀取函數dataset = list()# 定義一個空列表with open(the_name_of_file_to_be_read,"r") as file: # 文件讀取csv_reader = reader(file) # 讀取for row in csv_reader: # 循環(huán)文件內容逐行判斷if not row: # 如果不存在就跳過continue # continue的作用:用來結束本次循環(huán),緊接著執(zhí)行下一次的循環(huán)dataset.append(row) # 把讀取的內容追加到上面定義的空列表中return dataset # 返回列表 def conver_string_to_float(dataset,column): # 字符串轉數字函數dataset = dataset[1:] # 列表切分 保留列表索引1至最后一行for row in dataset: # 循環(huán)數據集row[column]=float(row[column].strip()) # 對每一行中每一列進行變化為浮點類型,去掉空格 the_name_of_file_to_be_read = "bbb.csv" # 數據文件 dataset = read_csv(the_name_of_file_to_be_read) # 讀取數據 for i in range(len(dataset[0])):# 取出一行的長度進行循環(huán)conver_string_to_float(dataset,i)# 調用字符串轉數字函數 print(dataset)# 打印 # 切片去掉字符保留數字 dataset=dataset[1:] dataset # 編寫函數:在數據集中找到最大值和最小值 def find_the_max_and_min_in_the_dataset(dataset): max_and_min=list() # 定義一個空列表for i in range(len(dataset[0])): # 安照列表中第一行的長度進行循環(huán)col_values = [row[i] for row in dataset] # 對每列中的數據進行循環(huán)value_max = max(col_values)# 取出每列中最大值value_min = min(col_values) #最小值max_and_min.append([value_max,value_min]) # 追加return max_and_min max_and_min=find_the_max_and_min_in_the_dataset(dataset) max_and_min # 打印每列中的最大最小值 # 計算數據集的平均值 函數 def calculate_the_mean_of_the_dataset(dataset):means = list()for i in range(len(dataset[0])): # 安照列表中第一行的長度進行循環(huán)col_values = [row[i] for row in dataset] # 對每列中的數據進行循環(huán)mean = sum(col_values)/float(len(dataset)) #每一列數據和除以數據個數得出平均值means.append(mean)return means means_list = calculate_the_mean_of_the_dataset(dataset) means_list # 打印每列的平均值 # 計算數據集的標準偏差 def calculate_the_stdevs_of_the_dataset(dataset,means):stdevs = ["占位符" for i in range(len(dataset[0]))]for i in range(len(dataset[0])):# 對列表進行迭代variance = [pow(row[i]-means[i],2) for row in dataset]stdevs[i] = sum(variance)stdevs=[sqrt(element/float(len(dataset)-1)) for element in stdevs] # 偏估計要除以n-1return stdevs stdevs_list = calculate_the_stdevs_of_the_dataset(dataset,means_list) stdevs_list #打印每列的偏差 # 數據集的標準化 def the_standardization_of_our_dataset(dataset,means_list,stdevs_list):for row in dataset:for i in range(len(row)):row[i] = (row[i]-means_list[i])/stdevs_list[i] the_standardization_of_our_dataset(dataset,means_list,stdevs_list) print(dataset) # 標準化后的數據數據劃分
train_test_split
例子一:
from random import seed from random import randrange # 訓練集,測試集劃分函數 def train_test_split(dataset,train=0.6):# 需要傳入的數據集,切分比例train_lanzi=list()# 創(chuàng)建一個空列表存放訓練集train_size = train*len(dataset) # train的長度就是0.6*數據總長度dataset_copy = list(dataset) # 把原始數據存放在該函數里while len(train_lanzi)<train_size: # 循環(huán) 當train_lanzi小于train_size一直循環(huán)執(zhí)行下面的語句random_choose_some_element = randrange(len(dataset_copy))# 生成指定遞增序列的隨機數長度是數據的長度train_lanzi.append(dataset_copy.pop(random_choose_some_element))# 使用pop函數在dataset_copy中取出random_choose_some_element中的數據追加到train_lanzi列表中return train_lanzi,dataset_copy測試
dataset = [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]] train,test = train_test_split(dataset) train,test #seed()被設置了之后,np,random.random()可以按順序產生一組固定的數組,如果使用相同的seed()值,則每次生成的隨機數都相同 #如果不設置這個值,那么每次生成的隨機數不同。但是,只在調用的時候seed()一下并不能使生成的隨機數相同,需要每次調用都seed()一下,表示種子相同,從而生成的隨機數相同。 seed(20210221) train,test = train_test_split(dataset) train,testk_fold交叉驗證
常用的是對標注數據集做7:3劃分訓練集和驗證集,只用了一部分數據,且結果很大程度上依賴于選取的數據。
LOOCV(Leave-one-out cross-validation):每次用一個樣本測試,其他數據訓練。計算量太大。
k_fold cv (k-fold cross validation) :把數據分K份,每次留一份進行驗證,k=N時是loocv。得到k個模型取最優(yōu)。
k的選取,過大投入訓練數據太多,極端例子成為loocv,導致每次訓練的數據相關性很大。
過小很難得到較優(yōu)結果
測試
# 測試 dataset = [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]] k_folds_split = k_fold_cross_validation_split(dataset,10) k_folds_split準確度計算代碼實現
簡單準確度
真實正確個數除以判斷正確的個數得到準確率(存在邏輯漏洞)
# 例子 # 正確答案[1,1,1,1,1] # 預測答案[1,1,1,0,0] print("準確度:",3/5) # 簡易模型準確度函數 # calculate accuracy of precdiction def calculate_the_accuracy_of_precdiction(actual_data,predicted_data): # 傳入實際數據,預測數據correct_num = 0 # 記正確的個數for i in range(len(actual_data)):# 按照數據的長度進行循環(huán)if actual_data[i]==predicted_data[i]: # 如果實際第i個數據等于預測數據的第i個correct_num+=1 # correct_num正確記數就加1return correct_num / float(len(actual_data)) # 預測的正確個數除真實數據個數得出準確值 # 測試 actual_data = [1,1,1,1,1,0,0,0,0,0] predicted_data = [1,1,1,1,1,1,1,1,1,1] accuracy = calculate_the_accuracy_of_precdiction(actual_data,predicted_data) accuracy混淆矩陣(誤差矩陣)
混淆矩陣也稱誤差矩陣,是表示精度評價的一種標準格式,用n行n列的矩陣形式來表示。具體評價指標有總體精度、制圖精度、用戶精度等,這些精度指標從不同的側面反映了圖像分類的精度。 [1] 在人工智能中,混淆矩陣(confusion matrix)是可視化工具,特別用于監(jiān)督學習,在無監(jiān)督學習一般叫做匹配矩陣。在圖像精度評價中,主要用于比較分類結果和實際測得值,可以把分類結果的精度顯示在一個混淆矩陣里面。混淆矩陣是通過將每個實測像元的位置和分類與分類圖像中的相應位置和分類相比較計算的。
代碼
# 混淆矩陣函數 def confusion_matrix(actual_data,predicted_data): # 混淆矩陣函數 傳入真實值與預測值#### 占位+列表解決第一個特性unique_class_in_data = set(actual_data)# 使用set去掉重復數據matrix = [list() for x in range(len(unique_class_in_data))]# 查看去重后有多少個數據for i in range(len(unique_class_in_data)):matrix[i] = [0 for x in range(len(unique_class_in_data))] # 有多少個數據就是生成X行X列的表格使用0占位 # print(unique_class_in_data) # print(matrix)#### 字典存儲與indexindexing_our_class = dict() # 創(chuàng)建一個空字典來存儲數據for i,class_value in enumerate(unique_class_in_data):indexing_our_class[class_value]=i # 使用循環(huán)給去重后的數據增加索引 # print(indexing_our_class)for i in range(len(actual_data)):# 使用真實數據的長度進行循環(huán)查找數據col = indexing_our_class[actual_data[i]] # 列 真實數據row = indexing_our_class[predicted_data[i]] # 行 預測數據matrix[row][col] += 1 # 將每次查找到的數據放入matrix進程存儲并記錄次數 # print(matrix)return unique_class_in_data,matrix # 調整美化混淆矩陣函數 def pretty_confusion_matrix(unique_class_in_data,matrix): print("(Actual)"+" ".join(str(x) for x in unique_class_in_data))print("(Predicted)----------------------")for i,x in enumerate(unique_class_in_data):print("{}| {}".format(x," ".join(str(x)for x in matrix[i]))) # 測試 actual_data = [0,2,0,0,0,1,1,5,2,1] predicted_data = [2,0,2,0,1,0,5,0,0,1] unique_class_in_data,matrix = confusion_matrix(actual_data,predicted_data) pretty_confusion_matrix(unique_class_in_data,matrix)回歸誤差
Mean Absolute Error(平均絕對誤差法)
對于回歸問題,最簡單的檢測誤差方法就是:Mean Absolute Error(平均絕對誤差法),以下為公式:
$MAE = \frac{\sum \limits_{i=1}^n \left | predicted_i -actual_i \right|}{total \, prediction} $
例子:
我們通過Python實現以上公式
利用數據檢測結果
actual_data =[1,2,3,4,5,2,3,4] predicted_data=[2,4,3,5,4,1,3,4]Mean_Absolute_Error=calculate_the_MAE(predicted_data,actual_data) print(Mean_Absolute_Error)
但是MAE的方法可能會有分類討論的情況,我們一般不太用。我們可以用Root Mean Squared Error
Root Mean Squared Error(均方根誤差)
# 公式 $RMSE=\sqrt\frac{\sum \limits_{i=1}^n(predicted_i - actual_i)^2}{total \, prediction}$
例子:
函數代碼:
簡易隨機預測基準模型建立
Whether the prediction for a given algorithm are good or not? 給定算法的預測是否良好?
分類問題
Baseline Models: 基準模型
Random Prediction Algorithm:隨機預測算法:
1.Find unique output values from training data 1.從訓練數據中找出唯一的輸出值
2.Randomly select output from the unique output set 2.從唯一輸出集中隨機選擇輸出
在該模型中我們0有90%1只有1% 最后得到的記過1卻比0多
ZeroR(Zero Rule) Algorithm
ZeroR(Zero Rule) Algorithm
9 [0] and 1[1]: #數據中有 90%是0和1%是1 # 前置條件
線性回歸問題
Regression: mean
from random import seed from random import randrange # 建立回歸函數 def ZeroR_Algorithm_regression(traning_data,testing_data):values=[row[-1] for row in traning_data] # 對測試數據進行迭代prediction=sum(values)/float(len(values)) # 使用測試數據總和除以數據個數ZeroR_prediction=[prediction for i in range(len(testing_data))] # 把均值按照測試數據的長度填充return ZeroR_prediction # 測試 seed(888) traning_data=[[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]] testing_data=[[None],[None],[None],[None],[None],[None],[None],[None],[None],[None]]prediciton=ZeroR_Algorithm_regression(traning_data,testing_data) print(prediciton)總結
以上是生活随笔為你收集整理的从零开始数据科学与机器学习算法-数据预处理与基准模型-01的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习实战-SVM算法-27
- 下一篇: 从零开始数据科学与机器学习算法-知识点补