決策樹算法是一種有監督的機器學習算法,它的結構類似於流程圖的樹狀結構。由節點和有向圖組成,節點分爲葉子節點和內部節點。葉子節點代表樣本的類別,內部節點表示一個特徵或者屬性。根節點到葉子節點的每一天路徑構建一條規則。而葉子節點代表對應的規則的結論。
信息熵:有標籤和樣本特徵來計算得到。
信息增益:標籤的信息熵減去樣本特徵的信息熵。越大特徵越優。下面我們用kaggle上大賽的數據來預測泰坦尼克號倖存者。
數據連接:https://download.csdn.net/download/qq_36581957/10814246
第一步,先對數據進行預處理。預處理的過程跟個人的理解有關。
import pandas as pd;
def DataAnalyse():
data=pd.read_csv("./titanic/train.csv");
"""數據中有些對我們完全沒有用的信息,我們要去掉,比如:名字,票號,船艙號,樣本的ID號"""
data.drop(["PassengerId","Cabin","Ticket","Name","Embarked"],axis=1,inplace=True);#刪除了四個,我們還有7個特徵。其中一個是標籤
"""對性別進行編碼"""
data["Sex"]=(data['Sex']=='male').astype("int")
"""處理登船港口"""
#labels=data["Embarked"].unique().tolist()
#data["Embarked"]=data["Embarked"].apply(lambda n:labels.index(n))
"""數據中有一些沒有值得,我們全部補0"""
data=data.fillna(0)
data.info(); # 12個特徵量,去掉表頭,還剩891個樣本。、
Y_train=data["Survived"]
data.drop(["Survived"],axis=1,inplace=True)#在本身上操作。
X_train=data;
return X_train,Y_train;
if __name__ == '__main__':
X_train,Y_train=DataAnalyse();
X_train.info()
大概可以看一下運行結果:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 7 columns):
Survived 891 non-null int64
Pclass 891 non-null int64
Sex 891 non-null int32
Age 891 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Fare 891 non-null float64
dtypes: float64(2), int32(1), int64(4)
memory usage: 45.3 KB
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
Pclass 891 non-null int64
Sex 891 non-null int32
Age 891 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Fare 891 non-null float64
dtypes: float64(2), int32(1), int64(3)
memory usage: 38.4 KB
訓練集處理完以後,我們可以構建決策樹模型。
from sklearn.model_selection import train_test_split
def datasplit(X,Y):
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2);
return x_train,x_test,y_train,y_test;
from sklearn.tree import DecisionTreeClassifier
def DecisionTree(x_train, x_test, y_train, y_test):
clf=DecisionTreeClassifier()
clf.fit(x_train,y_train)
train_score=clf.score(x_train,y_train)
test_score=clf.score(x_test,y_test)
return train_score,test_score;
if __name__ == '__main__':
X_train,Y_train=DataAnalyse();
x_train, x_test, y_train, y_test=datasplit(X_train,Y_train)
train_score, test_score=DecisionTree(x_train, x_test, y_train, y_test);
print(train_score,test_score)
運行結果:
0.9859550561797753 0.8044692737430168
從運行結果上可以看出,訓練得分和測試得分有很高的差距,這是過擬合現象。我們在接下來的博文中繼續優化我們的實例