轉帖|使用教程|編輯:龔雪|2017-04-17 10:47:02.000|閱讀 375 次
概述:如果你是一個機器學習的初學者,本系列文章將教你用R語言開啟機器學習之旅
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
文|陸勤
我們將要使用iris這個數據集。這個數據集是非常有名的,因為這是機器學習和統計學里的”hello world”類數據集,這對于每個人來說都非常實用。
這個數據集含有150個觀測值,而且這個數據集有4列,這些列表示花的直徑的測量。而這個數據集的第五列就是花的類型,而所有的觀測值則是3種花里的其中一種。
關于這個數據集的更多細節,你可以上維基百科尋找,網址:
接下來,我們要對這個數據集進行如下操作:
1 以一個簡單的方式導入iris數據集
2 以CSV格式(其它格式也可以)導入iris數據集
3 把這個數據集分解成訓練數據集和驗證數據集
你可以自行選擇方法導入這些數據,或者直接按照上面的步驟執行。
幸運的是,iris這個數據集是系統自帶的,也就是說安裝好R以后就有?,F在,按照以下操作導入數據:
#attach the iris dataset to the environment data(iris) #rename the dataset dataset <- iris
這時你已經完成了iris數據集的導入,現在,你需要檢驗這個數據集了。
我喜歡把載入的數據稱為“數據集”。如果你想對你的項目和數據集(它們之間總是名字相同)之間進行代碼的粘貼,那么,這里確實會給到你幫助。
也許,你是一個純粹主義者,而且,你是想以你自己的方式導入CSV格式的數據集到你的機器學習項目的話,可以參照下面的做法:
從
UCIMachine Learning Repository
(這里有一個直接找到這個數據集的 鏈接 )
這里下載iris數據集。
把文件以iris.csv的形式保存的你的工作目錄中。
載入CSV格式數據詳細操作如下:
#define the filename filename <- "iris.csv" #load the CSV file from the local directory dataset <- read.csv(filename, header=FALSE) #set the column names in the dataset colnames(dataset) <- c("Sepal.Length","Sepal.Width","Petal.Length","Petal.Width","Species")
你現在已經載入好iris數據集,同時也可以使用里面的變量了。
我們需要知道我們現在所建立的模型足夠好。
然后,我們會在那些未知的數據中運用相關統計方法建模以預測這些模型的精度。我們還需要進行更多高質量的模型精度測試以估計出這個模型是否在這些未知的數據中是最好的,這樣我們要通過對真實的未知的數據進行估計。
這時,我們需要看回我們的數據集,而我們所用的算法將看不到這些數據,而我們就是要用這些數據來得到其次而獨立的,關于如何知道最好的模型大致是怎樣的情況這一定論。
我們要把這個數據集進行分離操作,80%的數據用于進行進行訓練,而剩下的20%則用來進行驗證。
#create a list of 80% of the rows in the original dataset we can use for training validation_index <- createDataPartition(dataset$Species, p=0.80, list=FALSE) #select 20% of the data for validation validation <- dataset[-validation_index,] #use the remaining 80% of data to training and testing the models dataset <- dataset[validation_index,]
在數據集中你現在有了訓練數據集和將在后來要用到的驗證變量的驗證集。
注意我們采用80%的樣本數據取代我們的數據集,這個嘗試為了讓我們后面代碼更簡潔和可讀。
現在,是時候要看看我們的數據了。
在這一步,我們會用不同的方法來看這個數據集:
1這個數據集的維度。
2屬性的類型。
3查看你的數據集。
4分類屬性的層次。
5每一類所產生的異常值。
6對于所有屬性的統計歸納。
不要擔心,看到的數據都是以一行命令的形式展現。這些命令是非常有用的,尤其是你想要進行你項目的后續工作時。
我們快速瀏覽一下dim函數里一共有多少實例(行)以及多少個屬性(列)。
#dimensions of dataset dim(dataset)
你應該能看到120個實例和5個屬性:
1120 5
得到這些屬性的相關信息是一個不錯的主意。它們可以是雙精度值、整數值、字符串、因子和其它類型。
知道這些類型是很重要的,就像告訴你怎樣更好的匯總你所得到的數據以及它們的類型的轉換形式那樣,你也許在建模之前就會這樣的去準備數據。
#list types for each attribute sapply(dataset, class)
你應該能看到輸入值是雙精度類型,而它的分類類型則是因子。
Sepal.Length Sepal.Width Petal.Length Petal.Width Species "numeric" "numeric" "numeric" "numeric""factor"
預覽一下你的數據也是一個不錯的主意。
#take a peek at the first 5 rows of the data head(dataset)
你可以看一下前5行的數據:
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
分類變量就是因子的一種形式。一個因子的分類有很多分類標簽或層次,讓我們看看這些層次:
#list the levels for the class levels(dataset$Species)
留意一下我們上面是怎樣把數據集里的屬性轉換成合適的名字的形式。下面的結果我們可以看到3個標簽:
1“setosa” “versicolor” “virginica”
這是一個多層次或多項的分類問題。這里如果有2個層次,那么它是一個二次分類問題。
現在,我們看一下數據集里的實例(行)都屬于什么類型。我們可以以絕對值和百分數的形式觀察它們:
1#summarize the class distribution 2percentage <- prop.table(table(dataset$Species)) * 100 3cbind(freq=table(dataset$Species), percentage=percentage)
我們可以看到,每個層次都有相同數量的實例(這個數據集的40%或33%)。
1freq percentage
2setosa 40 33.33333
3versicolor 40 33.33333
4virginica 40 33.33333
現在到了最后,我們看一下統計歸納以后各屬性的相關信息。
這里包含平均值、最值,以及分位數(25分位數、中位數、75分位數等等處在分位點的數,只要我們要求哪個分位點的數表示出來,它都可以在相關屬性中展現出來)。
#summarize attribute distributions summary(dataset)
我們現在看到了所有數值屬性都含有相同的刻度(厘米)以及相似的厘米區間[0,0.8]。
1 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
2 Min. :4.300 Min. :2.00 Min. :1.000 Min. :0.100 setosa :40
3 1st Qu.:5.100 1st Qu.:2.80 1st Qu.:1.575 1st Qu.:0.300 versicolor:40
4 Median :5.800 Median :3.00 Median :4.300 Median :1.350 virginica:40
5 Mean :5.834 Mean :3.07 Mean :3.748 Mean :1.213
6 3rd Qu.:6.400 3rd Qu.:3.40 3rd Qu.:5.100 3rd Qu.:1.800
7 Max. :7.900 Max. :4.40 Max. :6.900 Max. :2.500
現在,我們對數據集進行初步的探索。我們需要運用數據可視化操作進行更深層次的探索。
接下來,我們將要看到2種圖像:
1畫單變量圖以了解每個屬性的相關信息。
2畫多變量圖來了解每個屬性之間存在的關系。
我們從單變量圖像開始,看看圖像里每個變量大致的分布情況。
運用可視化操作把數據里的輸入屬性和輸出屬性轉化為相關信息?,F在我們開始畫單變量圖像,且設輸入變量為x,輸出變量為y(或者層次):
1 # split input and output
2 x <- dataset[,1:4]
3 y <- dataset[,5]
我們看到輸入變量是數值形式,接下來,我們畫一下箱圖和條形圖:
par(mfrow=c(1,4)) for(i in 1:4) { boxplot(x[,i],main=names(iris)[i]) }
這樣就把輸入變量的分布情況清清楚楚的展現出來:
我們也可以對特殊的層次變量作條形圖來得到數據里各個分類在圖像里的分布情況(通常來說它看起來很無趣,因為這種圖像看起來平的)。
plot(y)
現在,我們看一下變量之間的相關關系。
首先,我們對所有的屬性兩兩的作散點圖,并通過它們的層次設置不同的顏色。此外,由于散點圖在展示每個層次的點都是分開來的,我們可以在這些點周圍畫一個橢圓。
#scatterplot matrix featurePlot(x=x, y=y,plot="ellipse")
現在,我們對分類變量里的輸入變量屬性和輸出變量屬性直接的關系有了清楚的認識:
我們也可以再一次以箱圖和晶須圖的形式觀察輸入變量,但是這一次我們要根據層次把這些點分開來。這能讓我們在各層次之間的線性分離中有效地提取相關信息。
featurePlot(x=x,y=y, plot=”box”)
這對于我們清楚觀察每個層次的值的屬性的不同分布是非常有用的。
接下來,我們從每個屬性的分布中提取相關信息,我們再一次運用箱圖和晶須圖,同樣把層次的值進行分離。有時使用直方圖能取得良好的效果,但這一次,我們會使用密度函數圖像,并配上平滑的曲線來展示每一個屬性的分布情況:
1 # density plots for each attribute by class value 2 scales <- list(x=list(relation="free"), y=list(relation="free")) 3 featurePlot(x=x, y=y, plot="density", scales=scales)
就像箱圖所展示的那樣,我們可以看到不同層次里每個熟悉的分布。我們也可以看到每個屬性所呈現的高斯分布(鐘形曲線)圖像:
英文鏈接:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn