線性迴歸(Linear Regression)是機器學習(Machine Learning)中常用且基本的model之一,但Sckit-Learn中線性迴歸不僅僅只是能處理線性資料,也能以簡單的方式以多項式迴歸(Polynomial Regression)對資料做擬合(fitting)。換句話說,也就是不儘是線性函數:
y = ax + b
也能以多項式擬合(fitting):
y = ax + bx^2 + cx^3+ ........
怎麼做呢? 基本上就是山不轉路轉,動不了特徵值,換個x值總可以吧。
來看看實際例子:
先import會用到的module:
其中PolynomialFeatures就是轉換座標的關鍵函式(Polynomial basis functions)。
舉例來說,若我本來輸入的x值是2,4,6,此函式就會幫我們轉成2次、3次等等。
只要利用.fit_transform就可以輕鬆達成!!!
看一下實際例子吧,假如我們有下列的資料:
這一看就明顯不是"線性",反而像正弦之類的函數,我們這邊嚐試利用多項式來解,
利用剛才的工具:
我們調用了sklearn.linear_model的LinearRegression,並用較高階的語法make_pipeline直接把x值轉換與模型建立一次完成了。注意在PolynomialFeatures中,我們使用到六次項(6)。
接著擬合剛建立的模型(poly_model)poly_model.fit(),其中xfit是我們自己建立的x值:
得到yfit後,再畫出本來的資料與得到的model,看來結果還不錯囉!!!
參考資料:https://jakevdp.github.io/PythonDataScienceHandbook/
2018年6月18日 星期一
2018年6月13日 星期三
jupyter lab module不能import的問題
Jupyter Lab是jupyter notebook的新版,但會常碰到一些module沒法成功import的問題。我就碰過幾次了,都會跑出這個結果:
沒法import pandas-datareader
參考stackoverflow
我的方法就是重裝囉:
沒法import ipywidgets
參考ipywidgets官網
install the JupyterLab Extension
這應該能解決問題囉!!
ImportError: cannot import name 'is_list_like'
這邊把解法記下來:沒法import pandas-datareader
參考stackoverflow
我的方法就是重裝囉:
> pip install git+https://github.com/pydata/pandas-datareader.git
沒法import ipywidgets
參考ipywidgets官網
install the JupyterLab Extension
> jupyter labextension install @jupyter-widgets/jupyterlab-manager
這應該能解決問題囉!!
2018年6月10日 星期日
Python:刪除重複值
最近試著寫個有關於字串的程式,其中必須要把重複值去掉,這才發現沒想像中那麼簡單。把結果紀錄如下。
當然最直觀的做法就是寫個for 迴圈,找出重複的部分再重組成一個新的list,當然這樣做是可以的,但比較麻煩,也容易出錯,最"簡單"(程式碼較少)的作法是利用python的資料結構set。
我們都知道python中的set會把重複的部分去除(這是我們要的):
這邊我們有個list(new_list),內有重複的'def',我們將new_list轉成set,再轉回list就可以把重複值去除了。
但很明顯的是,這樣做的缺點是次序會被打亂,因此解決的方式就是另用sorted函式並加個key:
達成目標了!!!
不過或許會有疑問,為什麼不使用sort函式?
這是因為sort是inline的排列,並不會回傳排序後的新list(回傳值是None):
所以如果排序只是程式中的一個步驟,沒有回傳值會很麻煩,小弟才疏學淺,接下來我實在不知怎寫下去。
當然python資料處理就不能忘了資料清洗之王Pandas,有了pandas,我們就可以利用.drop_duplicates函式處理。先import pandas,再把資料轉成pandas的series:
接下來進行去重複值的工作:
這邊要注意的是,.drop_duplicates函式會回傳一個新的series,並不會更改原來的series。
到這邊好像跟之前的方法大同小異,還要import pandas,好像也沒有更簡單,不過如果這麼想,這就太小看pandas了,.drop_duplicates函式預設的是保留(keep)第一個重複的值(keep='first'),刪除其他的重複值,但如果是你想保留最後一個呢?嘿嘿~~~這就非得用pandas了,將函式中的keep值設為'last':
如果心情不好,重複的值都去掉也可以,keep設為False就可:
當然最直觀的做法就是寫個for 迴圈,找出重複的部分再重組成一個新的list,當然這樣做是可以的,但比較麻煩,也容易出錯,最"簡單"(程式碼較少)的作法是利用python的資料結構set。
我們都知道python中的set會把重複的部分去除(這是我們要的):
這邊我們有個list(new_list),內有重複的'def',我們將new_list轉成set,再轉回list就可以把重複值去除了。
但很明顯的是,這樣做的缺點是次序會被打亂,因此解決的方式就是另用sorted函式並加個key:
達成目標了!!!
不過或許會有疑問,為什麼不使用sort函式?
這是因為sort是inline的排列,並不會回傳排序後的新list(回傳值是None):
所以如果排序只是程式中的一個步驟,沒有回傳值會很麻煩,小弟才疏學淺,接下來我實在不知怎寫下去。
當然python資料處理就不能忘了資料清洗之王Pandas,有了pandas,我們就可以利用.drop_duplicates函式處理。先import pandas,再把資料轉成pandas的series:
接下來進行去重複值的工作:
這邊要注意的是,.drop_duplicates函式會回傳一個新的series,並不會更改原來的series。
到這邊好像跟之前的方法大同小異,還要import pandas,好像也沒有更簡單,不過如果這麼想,這就太小看pandas了,.drop_duplicates函式預設的是保留(keep)第一個重複的值(keep='first'),刪除其他的重複值,但如果是你想保留最後一個呢?嘿嘿~~~這就非得用pandas了,將函式中的keep值設為'last':
如果心情不好,重複的值都去掉也可以,keep設為False就可:
2018年6月3日 星期日
Python: Numpy介紹
List是Python中常用的資料結構,因Python動態型別的特性,可以建立"異質"的list,例如:
In[1]: L1 = [2, True, 'a']
[type(item) for item in L1]
In[1]: L1 = [2, True, 'a']
[type(item) for item in L1]
Out[1]: [int, bool, str]
不過這種"動態"的特性並不是免費的,list中的每一個項目必須包含了資料的型態、大小、參考計數等等額外的資料,所以list的缺乏運算的效率(或者說根本沒法做數學運算),因此若能儲存成同一型態,雖然缺乏型態上的彈性,但卻能大幅增加運算的效率。雖然python提供了標準的array模組,但真的好用且真正多數人使用的是numpy模組。numpy會把陣列中的資料轉成相同的型態,因而提升運算效能:
常用的numpy程式指令:
陣列的串接,可分成水平跟垂直的方式:
有人喜歡用reshape也可:
陣列分割,np.split()中的second argument是分割的位置:
創建陣列,如.linspace這個在往後繪圖中會常用到:
Universal Function提供了方便的矩陣運算,可以看看下列例子:
numpy內的亂數random也是很常用的,非常非常重要。
random函數其實並不是真的"隨機"取樣,而是偽亂數,就是有亂數的樣子,但實際上是先安排好的,所以其實可以避免每一次取的亂數不同,方法就是利用.RandomState(),argument輸入相同的數字,取得的"亂數"就會相同,可以確保每一次執行都有一樣的結果:
另外也可以使用條件式取得布林陣列(True或是False),並用np.sum()或np.count_nonzero()計算符合運算條件的資料數目,這個在數據的分析上非常有用的。
注意np.sum()可以axis=0 or 1限定以行或列的方向進行運算,另外np.any()、np.all()應該看例子就可以理解用途了。
不過這種"動態"的特性並不是免費的,list中的每一個項目必須包含了資料的型態、大小、參考計數等等額外的資料,所以list的缺乏運算的效率(或者說根本沒法做數學運算),因此若能儲存成同一型態,雖然缺乏型態上的彈性,但卻能大幅增加運算的效率。雖然python提供了標準的array模組,但真的好用且真正多數人使用的是numpy模組。numpy會把陣列中的資料轉成相同的型態,因而提升運算效能:
常用的numpy程式指令:
陣列的串接,可分成水平跟垂直的方式:
陣列的改造,如陣列互換,這個在Machine Learning中常用到,非常重要。
有人喜歡用reshape也可:
陣列分割,np.split()中的second argument是分割的位置:
創建陣列,如.linspace這個在往後繪圖中會常用到:
Universal Function提供了方便的矩陣運算,可以看看下列例子:
numpy內的亂數random也是很常用的,非常非常重要。
random函數其實並不是真的"隨機"取樣,而是偽亂數,就是有亂數的樣子,但實際上是先安排好的,所以其實可以避免每一次取的亂數不同,方法就是利用.RandomState(),argument輸入相同的數字,取得的"亂數"就會相同,可以確保每一次執行都有一樣的結果:
另外也可以使用條件式取得布林陣列(True或是False),並用np.sum()或np.count_nonzero()計算符合運算條件的資料數目,這個在數據的分析上非常有用的。
注意np.sum()可以axis=0 or 1限定以行或列的方向進行運算,另外np.any()、np.all()應該看例子就可以理解用途了。
訂閱:
文章 (Atom)