kaggle上有个简单的机器学习教程,用的是Python,这篇文章尝试把其中的主要脉络梳理一下,如果你想要学习,还是推荐到网站上过一遍。
kaggle的数据集大都是以csv格式的文件存储的,你上传最终的结果时也要求以csv格式呈现,因此下面简单介绍下数据集的导入和导出。这个教程是以 预测Titanic幸存人数为例进行说明。
使用pandas可以将csv文件读入DataFrame格式的文件
import pandas
train = pd.read_csv('train.csv')
train.describe() #数据描述,总结所有样本某一特征的均值,最大最小,平均值等。
train.shape #查看数据的维数
# 导出的csv文件中包含两列,乘客的Id和是否幸存
PassengerId =np.array(test['PassengerId']).astype(int)
my_solution = pd.DataFrame(my_prediction, PassengerId, columns = ["Survived"])
# 写入硬盘,以my_solution_one.csv文件名存储
my_solution.to_csv("my_solution_one.csv", index_label = ["PassengerId"])
如果想对某一特征有多少个类别计数,比如Survived这一列,1表示是,0表示否
train['Survived'].value_counts()#注:也可以写作 train.Survived.value_counts()
Out[1]:
0 549 #死亡549人
1 342 #幸存342人
也可以对数据归一化显示,只需要在value_counts的括号内加 normalize=True 就可以了:
In [3]: train['Survived'].value_counts(normalize = True)
Out[3]:
0 0.616162
1 0.383838
Name: Survived, dtype: float64
上面的方法只是统计出了所有乘客的幸存与死亡人数,那么如果只想统计女性乘客中的死亡与幸存人数呢?
In [5]: train["Survived"][train.Sex == 'female'].value_counts() #只统计女乘客中的幸存人数与死亡人数
Out[5]:
1 233
0 81
Name: Survived, dtype: int64
同样如果想得到比例只需在value_counts括号内加入normalize = True即可。
我们考虑儿童是不是生存率更高呢?因此在训练集中加入一维特征 Child:
train["Child"] = float('NaN')
train.Child[train.Age < 18] = 1 #年龄小于18岁符合Child标准
train.Child[train.Age >= 18] = 0
print(train.Survived[train.Child == 1].value_counts(normalize = True))# 查看儿童的生存率
在数据集中的Sex这一维特征中是字符型的 male 和 female 为了后续的处理方便,我们将 male 置为 0,female为1:
train["Sex"][train["Sex"] == "male"] = 0
train.Sex[train.Sex == 'female'] = 1
对于某些特征中数据的缺失,可以根据情况加以处理:
train["Embarked"] = train.Embarked.fillna('S')
#将Embarked项中所有为NA的填充为'S',在该项特征中,'S'占比最多
#将字符特征转换为数字特征
train["Embarked"][train["Embarked"] == "S"] = 0
train["Embarked"][train["Embarked"] == "C"] = 1
train["Embarked"][train["Embarked"] == "Q"] = 2
#将Fare项中所有NA值填充为Fare的中位数
train.Fare = train.Fare.fillna(train.Fare.median())
注:当对test数据集进行预测时,也需要做相应的数据预处理操作。
dataFrame格式的数据文件易于对数据进行一些预处理,处理完之后需要转换成array格式便于使用模型进行建模预测等。
target = train["Survived"].values #label
features_one = train[["Pclass", "Sex", "Age", "Fare"]].values #features
这里使用工具箱中的scikitlearn的决策树和随机森林进行数据预测
from sklearn import tree
my_tree_one = tree.DecisionTreeClassifier()
my_tree_one = my_tree_one.fit(features_one, target)
#这样就可以使用predict方法进行预测了。
print(my_tree_one.feature_importances_) #显示各特征的重要性
print(my_tree_one.score(features_one, target)) #显示正确率(训练集)
# 对测试数据进行预处理
test.Fare = test.Fare.fillna(test.Fare.median())
test_features = test[["Pclass", "Sex", "Age", "Fare"]].values
# 使用决策树进行预测
my_prediction = my_tree_one.predict(test_features)
在应用决策树时,为了防止过拟合可以对某些参数进行自定义
features_two
features_two = train[["Pclass","Age","Sex","Fare", "SibSp", "Parch", "Embarked"]].values
max_depth = 10 #树的深度小于10
min_samples_split = 5 #如果样本数小于5不再进行划分
my_tree_two = tree.DecisionTreeClassifier(max_depth = max_depth, min_samples_split = min_samples_split, random_state = 1)
my_tree_two = my_tree_two.fit(features_two, target)
#Print the score of the new decison tree
print(my_tree_two.score(features_two, target))
甚至可以在已有的特征中组合出新的特征
train_two = train
train_two['family_size'] = train_two.SibSp + train_two.Parch + 1
# Create a new decision tree my_tree_three
features_three = train_two[["Pclass", "Sex", "Age", "Fare", "SibSp", "Parch", "family_size"]].values
my_tree_three = tree.DecisionTreeClassifier()
my_tree_three = my_tree_three.fit(features_three, target)
print(my_tree_three.score(features_three, target))
随机森林也是应对决策树过拟合的一种方法:
from sklearn.ensemble import RandomForestClassifier
features_forest = train[["Pclass", "Age", "Sex", "Fare","SibSp", "Parch", "Embarked"]].values
#Building the Forest: my_forest
n_estimators = 100 #决策树的数量
forest = RandomForestClassifier(max_depth = 10, min_samples_split=2, n_estimators= n_estimators, random_state = 1)
my_forest = forest.fit(features_forest, target)
print(my_forest.score(features_forest, target))
test_features = test[["Pclass", "Age", "Sex", "Fare","SibSp", "Parch", "Embarked"]].values
pred_forest = my_forest.predict(test_features)
可以看出使用pandas可以方便的进行数据的导入和导出操作,简便的对数据进行预处理,包括对缺失值的处理,增加或组合某些特征等。在使用决策树时可以尝试不同的特征组合,有些特征比较重要,有些则没有什么作用。这篇简易的教程主要作用是提供了一个使用pandas进行数据处理分析的实例。