Kaggle上的titanic項目(1)

Kaggle上的titanic項目(1)

說明

用kaggle上的titanic作為練手項目,熟悉pandas的用法。寫這篇文章作為記錄和整理

思路很簡單,數據量不大,特徵也不多,暫且考慮logistic regression作為分類演算法。IDE是Jupyter notebook

# 首先是導入數據import pandas as pdtrain = pd.read_csv(train.csv)predict = pd.read_csv(test.csv)# 查看數據的大概樣子,知曉每一個屬性的對應實際意義,函數如下train.head() #用來查看一個dataframe的前幾行

predict.head()

# 查看數據的屬性train.info()print "===================我是分割線==================="test.info()輸出結果如下:

RangeIndex: 891 entries, 0 to 890

Data columns (total 12 columns):

PassengerId 891 non-null int64

Survived 891 non-null int64

Pclass 891 non-null int64

Name 891 non-null object

Sex 891 non-null object

Age 714 non-null float64

SibSp 891 non-null int64

Parch 891 non-null int64

Ticket 891 non-null object

Fare 891 non-null float64

Cabin 204 non-null object

Embarked 889 non-null object

dtypes: float64(2), int64(5), object(5)

memory usage: 83.6+ KB

===================我是分割線===================

RangeIndex: 418 entries, 0 to 417

Data columns (total 11 columns):

PassengerId 418 non-null int64

Pclass 418 non-null int64

Name 418 non-null object

Sex 418 non-null object

Age 332 non-null float64

SibSp 418 non-null int64

Parch 418 non-null int64

Ticket 418 non-null object

Fare 417 non-null float64

Cabin 91 non-null object

Embarked 418 non-null object

dtypes: float64(2), int64(4), object(5)

memory usage: 36.0+ KB

可以看到train中的Age,Cabin和Embarked 部分數據有缺失,Age和Embarked的缺失比較少,可以通過人工補全(比如講缺失值設為眾數或者平均數,也可以直接去掉那一行),但是Cabin的有效數據十分少,對我們的分析沒用,直接捨去。

另外這裡的分類是要求我們求一個人生還的可能性,因此基於一種常識,或者叫先驗知識,我們認為乘客的姓名,乘客的編號和ticket的編號對我們的分類起到的作用很少。因此也捨去不要

# 捨去冗餘和雜訊特徵train_new = train.drop([PassengerId,Name,Cabin,Ticket], axis=1)predict_new = test.drop([PassengerId,Name,Cabin,Ticket], axis=1) # 給Age的預設值指定一個默認值,這裡我一拍大腿想要設定為隨機值,具體為[0:99]之間的均勻分布。給Embarked的預設值指定為眾數。import numpy as nptrain_new[Age]=train_new[Age].fillna(round(np.random.uniform(1,99)))train_new[Embarked] = train_new[Embarked].fillna(train[Embarked].value_counts().argmax())# 同樣地,搞定testpredict_new[Age]=test_new[Age].fillna(round(np.random.uniform(1,99)))predict_new[Embarked] = test_new[Embarked].fillna(test[Embarked].value_counts().argmax())predict_new[Fare] = test_new[Fare].fillna(test[Fare].value_counts().argmax())

離散數據數值化

ok,現在數據基本齊全,但是要把它放入模型里計算還差一步。因為放入模型的只能是數字,而數據里有很多非數字的數據需要把他們一一映射成相應的數字(test_new[『Embarked』].value_counts()可以看到有多少類別)

#用啞變數數值化離散的特徵值,由於Sex只有兩個分類,不需要進行這一步dummy_Pclass = pd.get_dummies(train[Pclass], prefix=Pclass)dummy_Embarked = pd.get_dummies(train[Embarked], prefix=Embarked)test[Sex] = test[Sex].replace({female:2,male:1})train[Sex] = train[Sex].replace({female:2,male:1})# 行成新的dataframecols_to_keep = [Age, Sex,SibSp,Parch,Fare]train = train[[Age,Sex, SibSp,Parch,Fare,Survived]].join([dummy_Pclass.ix[:, Pclass_2:],dummy_Embarked.ix[:,Embarked_Q:]])test = test[cols_to_keep].join([dummy_Pclass.ix[:, Pclass_2:],dummy_Embarked.ix[:,Embarked_Q:]])train.head() # 查看正反例數量對比,正反例出現的概率是一樣的。減少因為樣本選取的原因對預測結果的影響。train[Survived].value_counts()#可以看到訓練樣本中正反例的數量比是:# 0 549# 1 342# Name: Survived, dtype: int64#平衡正反例數量,思路是先把數量多的樣本的行打亂,然後取前面一部分,再和數量少的樣本合併成一個新的訓練集train_positive = train[train[Survived]==1]train_negative = train[train[Survived]==0]import numpy as nrow_list = list(train_negative.index)np.random.shuffle(row_list)train = train_positive.append(train_negative.ix[row_list[0:len(train_positive.index)]])Y_train = train[Survived]X_train = train[[Sex,Age,SibSp,Parch,Fare,Pclass_2,Pclass_3,Embarked_Q,Embarked_S]]

ok,數據預處理就完成了,可以丟到學習機里去學習了。但是這個學習機到底怎麼選呢?當然要選最好的,什麼是最好的學習機呢?方法論很簡單,先設定評價標準,然後再找出再該評價標準下最好的模型(或者假設)。這裡有很多細節和處理經驗在裡面,我們暫且選擇用邏輯回歸試一下吧。

生成假設

# 開始邏輯回歸的實驗import sklearn.linear_model as mdlg = md.LogisticRegression(penalty=l2, dual=False, tol=0.0001, C=2.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver=liblinear, max_iter=1000)from sklearn.cross_validation import cross_val_scorescores = cross_val_score(lg, X_train, Y_train, cv=10, scoring=f1)scores.mean() #score.mean()的結果是0.77296418431066638#使用該模型預測,預測結果寫入logistic_exp1.csv中。lg.fit(X_train,Y_train)result = lg.predict(X_test)result= pd.DataFrame(result,columns=[Survived])result.insert(0,PassengerId,test_raw[PassengerId])result.to_csv(logistic_exp1.csv,index= False)

Ok,預測結果就誕生啦!!!撒花:.☆( ̄▽ ̄)/$: 。當然這只是十分簡單的數據處理,特徵選取也很粗糙,以及模型(假設)的設計也十分簡單。我們接下來再來慢慢優化改進!

總結

推薦閱讀:

數據分析第一關:初入數據之門
關聯規則分析-數據挖掘入門
pandas(一) 數據結構
什麼是最重要的事?

TAG:數據挖掘入門 |