第三篇[机器学习] 线性回归,找点数据小试牛刀

Titanic:Machine Learning from Disaster

Start here! Predict survival on the Titanic and get familiar with ML basics

some groups of people were more likely to survive than others, such as women, children, and the upper-class.

这其实是一个分类问题,从乘客的性别,船舱等级,年龄等预测乘客是否生还。

从kaggle上面的titanic下载了train.csv,test.csv,gender_submission.csv三份数据。

https://www.kaggle.com/c/titanic/data

 我用的编辑器是Pycharm

代码不是我写的,代码地址:

http://blog.csdn.net/qq_36143300/article/details/54933662?ABstrategy=codes_snippets_optimize_v4

如上(记得安装anaconda之前不用先装python3.0,否则新建project的时候会有两个python的exe让你选择)

记得把路径改变到你的csv文件存放的路径

可以先查看当前路径:

print os.getcwd()

 

titanic = pandas.read_csv('train.csv')
#print titanic.describe()
print (titanic.head())

如上,读取train.csv文件,显示表头,得到结果:

数据不是很完全,在使用之前需要进行一定处理。

titanic['Age'] = titanic['Age'].fillna(titanic['Age'].median())#对缺失值用平均值填充
#print titanic.describe()
print (titanic['Sex'].unique())
titanic.loc[titanic['Sex'] == 'male','Sex'] = 0 #loc定位到哪一行,将titanic['Sex'] == 'male'的样本Sex值改为0
titanic.loc[titanic['Sex'] == 'female','Sex'] = 1
print (titanic['Sex'].unique())
print (titanic['Embarked'].unique())
titanic['Embarked'] = titanic['Embarked'].fillna('S')     #用最多的填
titanic.loc[titanic['Embarked'] == 'S','Embarked'] = 0
titanic.loc[titanic['Embarked'] == 'C','Embarked'] = 1
titanic.loc[titanic['Embarked'] == 'Q','Embarked'] = 2
print (titanic['Embarked'].unique())

 这一段代码,对数据进行了处理

1.对缺失的age用平均值填充,也可以用其他:比如中位数等填充

2.将sex行中sex=male的值改成0,sex=female的值改为1

3.同理,将embarked的字符串信息修改成数字

 

复习python 列表/元组/字典/

列表:可变的数据类型,以方括号“[ ]”包围的数据集合,不同成员以“,”分隔。列表中可包含任何数据类型,也可包含另一个列表

元组:不可变序列,以圆括号“()”包围的数据集合,不同成员以“,”分隔,元组中数据一旦确立就不能修改

字典:键值对的集合,字典是以大括号“{}”包围的数据集合,字典是无序的,在字典中通过键来访问成员。字典是可变的,可以包含任何其他类型

 

from sklearn.linear_model import LinearRegression #线性回归
from sklearn.cross_validation import KFold #交叉验证库,将测试集进行切分交叉验证取平均
predictors = ['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked']   #用到的特征
alg = LinearRegression()
kf = KFold(titanic.shape[0],n_folds=3,random_state=1) #将m个样本平均分成3份进行交叉验证
predictions = []
for train, test in kf:
   train_predictors = (titanic[predictors].iloc[train,:])#将predictors作为测试特征
   train_target = titanic['Survived'].iloc[train]
   alg.fit(train_predictors,train_target) #拟合模型
   test_prediction = alg.predict(titanic[predictors].iloc[test,:])
   print (test_prediction)
   predictions.append(test_prediction)

 交叉验证(Cross validation), 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。

创建了一个空的列表predictions=[ ]

在这个for循环里,将predictors里面的特征和target的survived的值进行fit,得到test特征的预测值,将每次的结果添加进test_prediction

predictions = np.concatenate(predictions, axis=0)
predictions[predictions >.5] = 1
predictions[predictions <=.5] = 0
accury = sum(predictions[predictions == titanic['Survived']]) / len(predictions)#测试准确率
print (accury)

 这里np.concatenate将predictions的数据连接在一起

axis=0是指作用于列,类似的,axis=1是作用于行

如上,将得到的test_prediction值表示为0或者1,最后得到预测准确率,0.26(捂脸)

总结:


1.用线性回归分析数据的时候最重要的是对数据进行分析理解,不同的数据有不同的更合适的算法,同样的数据在找到最合适的分类和回归方法时还可以不断调整优化

2.数据处理还需要进一步强化,了解数据结构的知识

 

在下一篇随笔中,目标是用这篇代码进行修改并在此基础上记录一下有哪些线性回归的优化方法,争取提升准确率!

 

posted @ 2017-09-03 22:57  TimoTong  阅读(675)  评论(0编辑  收藏  举报