"There is only one heroism in the world: to see the world as it is, and to love it." - Romain Rolland

淺談Python的複製

這裡用三個不同list來示範不同copy的差別: 1 2 3 4 import copy a = [1, 2, 3] b = [4, 5, 6] c = [a, b] Using normal assignment operatings to copy: 1 2 3 d = c print (id(c) == id(d)) # True - d和c是相同object print (id(c[0]) == id(d[0])) # True - d[0]和c[0]是相同object Using a shallow copy: 1 2 3 d = copy.copy(c) print (id(c) == id(d)) # False - d是新的object,跟c不同 print (id(c[0]) == id(d[0])) # True - d[0]和c[0]是相同object Using a deep copy: 1 2 3 d = copy.

Pandas ufuncs小技巧

Pandas的ufuncs為什麼比apply command還建議使用? Pandas 有一個apply function讓你可以針對所有在column的值執行任何functions。注意apply只是比python內建的loop還要快一點點而已!這就是為什麼pandas的內建ufuncs比較推薦使用在columns的預處理(preprocessing)。 ufuncs是特殊functions(建構在numpy的library)裡面並由C來實行,這就是為何ufuncs會如此之快。以下會介紹幾種ufuncs的例子(.diff, .shift, .cumsum, .cumcount, .str commands (作用在字串), .dt commands (作用在日期))。 1 範例數據 — 暑期活動這裡透過下面的數據集來演示pandas的ufuncs(同一個人可以在不同的時間軸上進行不同的活動) 這裏假設我們的任務是要基於上面的數據集去預測誰是最有趣的同學 2 1. String commands 如果我們想要對字串做切割的話,string commands (which are Ufuncs)是最推薦的: 1 df['name'] = df.name.str.split(" ", expand=True) 除此之外你可以用pandas.Series.str.replace 來更有效的清理字串。 3 2. Group by and value_counts透過groupby和value_counts我們可以輕鬆數出每個人做過多少次活動: 1 df.groupby('name')['activity'].value_counts() 這稱為multi index ,它可以讓我們同時在dataframe中擁有不同的index層,在圖片中人名就是level 0而activity是level 1。 4 3. Unstack我們也可以創建每個人的活動計數特徵,透過unstack方法,可以將行與列互換,unstack會把最低level的index轉換成cloumns,每個人的活動計數會變成cloumns,對於沒有從事該活動的人欄位會維持缺失值NaN,可以對其進行缺失值填補。 1 df.groupby('name')['activity'].value_counts().unstack().fillna(0) 5 4. groupby, diff, shift, and loc + A great tip for efficiency如果能了解一個人在活動中從事的時間,必定能對我們了解誰是最有趣的人有幫助。誰在party待最久?誰在海邊待最久? 對於時間長短最有效的推算方式就是先使用groupby歸類人名,再用diff()算出時間差: 1 2 df = df.

Kaggle Tatanic Stacking 學習模型整理

在看過Kaggle 上Titanic的一些kernels,其中不乏用SVM, RandomForest, LogisticRegression, etc. 而這Kernel有趣的是他利用6種不同的learning models去建模。 Introduction to Ensembling/Stacking in Python Using data from Titanic: Machine Learning from Disaster 在Level 1用了RandomForestClassifier, AdaBoostClassifier, GradientBoostingClassifier, ExtraTreesClassifier, SVM,而Level 2用了XGBoost。 我大致畫出整個模型的流程架構,以便於理解,光看源碼其實很難短時間理解在幹嘛,作者靈活的用了class來降低在jupyter notebook內程式碼的複雜度,方便之後修改和整理。 0.1 Level 1這裡最重要的是數據處理,Kaggle只給了我們兩份資料:train & test,其中train.shape = (891, 12),test.shape = (418,11)。 用交叉驗證切割train之後會有178 x 5的數據集,由於我們n-fold有五組,Model也有五個,這裡容易腦袋打結。所以我們先用model 1(隨機森林)舉例:train切成五組之後丟給隨機森林訓練,第一組有713人當訓練集,178人當驗證集(validation set),第二組則換成另一批713人當訓練集,178人當驗證集,以此類推。驗證出來的答案打包成一組178 x 4+179剛好成為891的et_oof_train(注意!KFold把我們的資料切成5份時,實際上是把第一份切成712 x 179,其餘切成713 x 178,我就是卡在這裡..囧)。 當我們對每個模型這樣做的時候,就得到五個out-of-fold_train,結合在一起就變成891 x 5的訓練集(就是XGBoost的訓練集)! 那XGBoost的測試集哪裡來?再用剛剛隨機森林做例子:我們把訓練集分成五組,所訓練出來的隨機森林就有5個,現在就用5個隨機森林去對test預測,所預測出來的結果就是之5 x 418! 我們在將其求平均並reshape(-1, 1),所得到的結果是(418,)的ndarray,數值介在0~1之間。 又我們有5個models,所以最後的x_test有418 x 5個數。 0.2 Level 2最後在XGBoost中剩下調參數了,放一下作者的參數做參考 1 2 3 4 5 6 7 8 9 10 11 12 13 gbm = xgb.

Pandas cut與qcut函數

如果我們今天有一些連續性的數值,可以使用cut及qcut進行離散化。 cut函数是利用數值區間將數值分類,qcut則是用分位數。 換句話說,cut用在長度相等的類別,qcut用在大小相等的類別。 1 cut函數 假設我們有一些人的年齡 ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32, 101] 我們如果想要離散化這些數列,分成“18到25”、“25到35”、“35到60”以及“60以上”,可以使用cut函數 1 2 3 4 5 6 7 bins = [18, 25, 35, 60, 100] cats = pd.cut(ages, bins) cats output: [(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (60, 100], (35, 60], (35, 60], (25, 35], NaN] Length: 13 Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]] 第一個list是指每個年齡分別在哪個範圍內,如果超出了就變成NaN缺失值,cats有兩個屬性: 1 2 3 cats.