tropicbirdのブログ

備忘録です。

【備忘録】pandas.DataFrameに関するメモ

・データフレームに対して.info()メソッドを使うと、空白やNull値の有無を確認できる。

・データフレームに対して.describe()メソッドを使うと、定量データのコラムについての概要が確認できる。

・データフレームに対して.describe(include=["O"])と引数(アルファベットをO(オー))を指定すれば、カテゴリカルデータの特徴を知ることができる。

・名前で参照するときにはloc属性を使う。インデックス位置による参照の時はiloc属性を使う。

【kaggle】タイタニックのコンペ(7)

Kaggleで定番のタイタニック号の生存者の分析をPythonで行う記録。

↓コンペのサイトはここです。
Titanic: Machine Learning from Disaster | Kaggle

Pythonによる分析の一例をManav Sehgalさんのカーネルを参考に(と言いうかこれに沿って)行います。
↓Manav Sehgalさんの分析手順はここで確認ができます。
Titanic Data Science Solutions | Kaggle

18. モデル、予測、解決

・今までのプロセスでデータの予測をする準備が整った。
・たくさんの予測モデルがある中で、課題の内容に即したモデルを選ぶ必要gあある。
・今回の課題は分類(classification)と回帰(regression)の内容である。
・生存の有無と各変数の関係を知りたい。
・今回は教師あり学習である。
・「教師あり学習」と「分類及び回帰」に適した予測方法には以下がある。

#不要な属性を取り除く。
train_df=train_df.drop(['FamilySize','Age','AgeBand','Fare_category','SibSp','Parch'],axis=1)
train_df.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 9 columns):
Survived        891 non-null int64
Pclass          891 non-null int64
Sex             891 non-null int32
Fare            891 non-null int32
Embarked        891 non-null int32
Title           891 non-null int64
Age_category    891 non-null float64
IsAlone         891 non-null int64
Age*Class       891 non-null float64
dtypes: float64(2), int32(3), int64(4)
memory usage: 52.3 KB
'''

test_df=test_df.drop(['FamilySize','Age','Fare_category','SibSp','Parch'],axis=1)
test_df.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 9 columns):
PassengerId     418 non-null int64
Pclass          418 non-null int64
Sex             418 non-null int32
Fare            418 non-null int32
Embarked        418 non-null int32
Title           418 non-null int64
Age_category    418 non-null float64
IsAlone         418 non-null int64
Age*Class       418 non-null float64
dtypes: float64(2), int32(3), int64(4)
memory usage: 24.6 KB
'''

#モデルに当てはめるための前処理
X_train=train_df.drop('Survived',axis=1)
Y_train=train_df['Survived']
X_test=test_df.drop('PassengerId',axis=1).copy()
X_train.shape, Y_train.shape, X_test.shape
#出力:((891, 8), (891,), (418, 8))

from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC, LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import Perceptron
from sklearn.linear_model import SGDClassifier
from sklearn.tree import DecisionTreeClassifier

・Logistic Regression:ロジスティック回帰

logreg=LogisticRegression()
logreg.fit(X_train,Y_train)
Y_pred=logreg.predict(X_test)
acc_log=round(logreg.score(X_train,Y_train)*100,2)
acc_log
#出力:80.92
#ロジスティック回帰では各属性の係数を計算することで、それぞれが結果に与える影響を検証することが可能である。正の係数は生存確率を高め、負の係数は生存確率を低くする。Sexは女性が0,男性が1なので、男性に方が生存確率を低くすることが分かる。
coeff_df=pd.DataFrame(train_df.columns.delete(0))
coeff_df.columns=['Feature']
coeff_df['Correlation']=pd.Series(logreg.coef_[0])
coeff_df.sort_values(by='Correlation',ascending=False)
'''
    Feature	Correlation
4   Title	0.440642
6   IsAlone	0.377805
3   Embarked	0.292706
2   Fare	0.061489
7   Age*Class	-0.138891
5   Age_category	-0.217198
0   Pclass	-0.885901
1   Sex	-2.119842
'''

・Support Vector Machines:サポートベクターマシン

svc=SVC()
svc.fit(X_train,Y_train)
Y_pred=svc.predict(X_test)
acc_svc=round(svc.score(X_train,Y_train)*100,2)
acc_svc
#出力:83.5

・KNN or k-Nearest Neighbors:k近傍法

knn=KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train,Y_train)
Y_pred=knn.predict(X_test)
acc_knn=round(knn.score(X_train,Y_train)*100,2)
acc_knn
#出力:83.95

・Naive Bayes classifier:ナイーブベイズ分類器

gaussian=GaussianNB()
gaussian.fit(X_train,Y_train)
Y_pred=gaussian.predict(X_test)
acc_gaussian=round(gaussian.score(X_train,Y_train)*100,2)
acc_gaussian
#出力:76.88

・Perceptron:パーセプトロン

perceptron=Perceptron()
perceptron.fit(X_train,Y_train)
Y_pred=perceptron.predict(X_test)
acc_perceptron=round(perceptron.score(X_train,Y_train)*100,2)
acc_perceptron
#出力:78.45

・線形SVM

linear_svc=LinearSVC()
linear_svc.fit(X_train,Y_train)
Y_pred=linear_svc.predict(X_test)
acc_linear_svc=round(linear_svc.score(X_train,Y_train)*100,2)
acc_linear_svc
#出力:79.57

・Stochastic Gradient Descent:確率的勾配降下法

sgd = SGDClassifier()
sgd.fit(X_train, Y_train)
Y_pred = sgd.predict(X_test)
acc_sgd = round(sgd.score(X_train, Y_train) * 100, 2)
acc_sgd
#出力:78.68

・Decision Tree:決定木

decision_tree = DecisionTreeClassifier()
decision_tree.fit(X_train, Y_train)
Y_pred = decision_tree.predict(X_test)
acc_decision_tree = round(decision_tree.score(X_train, Y_train) * 100, 2)
acc_decision_tree
#出力:86.64

・Random Forrest:ランダムフォレスト

random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(X_train, Y_train)
Y_pred = random_forest.predict(X_test)
random_forest.score(X_train, Y_train)
acc_random_forest = round(random_forest.score(X_train, Y_train) * 100, 2)
acc_random_forest
#出力:86.64

・モデルの精度を比較する。

models=pd.DataFrame({
    'Model':['Support Vector Machines','KNN','Logistic Regression',
            'Random Forest','Naive Bayes','Perceptron',
            'Stochastic Gradient Decent','Linear SVC',
            'Decesion Tree'],
    'Score':[acc_svc,acc_knn,acc_log,acc_random_forest,acc_gaussian,
            acc_perceptron,acc_sgd,acc_linear_svc,acc_decision_tree]})
models.sort_values(by='Score',ascending=False)
'''出力
Model	Score
3	Random Forest	86.64
8	Decesion Tree	86.64
1	KNN	83.95
0	Support Vector Machines	83.50
2	Logistic Regression	80.92
7	Linear SVC	79.57
6	Stochastic Gradient Decent	78.68
5	Perceptron	78.45
4	Naive Bayes	76.88
'''

#提出するデータを作成する。
submission=pd.DataFrame({'PassengerId':test_df['PassengerId'],
'Survived':Y_pred})
submission.head()

'''出力
PassengerId	Survived
0	892	0
1	893	1
2	894	0
3	895	0
4	896	1
'''

#submissionをcsv形式で書き出し、kaggleのコンペに提出する。
submission.to_csv('submission.csv',index=False)

【kaggle】タイタニックのコンペ(6)

Kaggleで定番のタイタニック号の生存者の分析をPythonで行う記録。

↓コンペのサイトはここです。
Titanic: Machine Learning from Disaster | Kaggle

Pythonによる分析の一例をManav Sehgalさんのカーネルを参考に(と言いうかこれに沿って)行います。
↓Manav Sehgalさんの分析手順はここで確認ができます。
Titanic Data Science Solutions | Kaggle

17.4.数字の連続データを補完する。

・欠損値やNull値がある属性を推測する。まずは年齢のNull値を推測する。
・推測手法を3つ試みる。
・推測手法1:平均と標準偏差に従う乱数を発生させる。
・推測手法2:他の属性との相関から予測する。
・推測手法3:推測手法1と2の組み合わせ。等級と性別ごとの平均と標準偏差について、乱数を発生させる。
・推測手法1と3は乱数を使うため、値が安定しないので、今回は推測手法2を採用する。

#性別の2値(Sex:0,1)と等級の3値(Pclass:1,2,3)の組み合わせによる年齢を推測する。
guess_ages=np.zeros((2,3))

for dataset in combine:
    for i in range(0,2):
        for j in range(0,3):
            guess_df=dataset[(dataset['Sex']==i)&\
                             (dataset['Pclass']==j+1)]['Age'].dropna()
            age_guess=guess_df.median()
            guess_ages[i,j]=int(age_guess/0.5+0.5)*0.5
    
    for i in range(0,2):
        for j in range(0,3):
            dataset.loc[(dataset.Age.isnull())&\
                        (dataset.Sex==i)&\
                        (dataset.Pclass==j+1),'Age']=guess_ages[i,j]
    dataset['Age']=dataset['Age'].astype(int)
    
train_df[train_df.Age.isnull()]
'''出力
	Survived	Pclass	Sex	Age	SibSp	Parch	Fare	Embarked	Title
→AgeのNull値が無いことが確認できた。
'''

・Ageを5つのグループに分ける。

train_df['AgeBand']=pd.cut(train_df['Age'],5)
train_df[['AgeBand','Survived']].groupby(['AgeBand'],as_index=False).\
mean().sort_values(by='AgeBand',ascending=True)
'''出力
	AgeBand	Survived
0	(-0.08, 16.0]	0.550000
1	(16.0, 32.0]	0.337374
2	(32.0, 48.0]	0.412037
3	(48.0, 64.0]	0.434783
4	(64.0, 80.0]	0.090909
'''

・Ageの5つのグループに序数を与える。

for dataset in combine:
    dataset.loc[ dataset['Age'] <= 16, 'Age_category'] = 0
    dataset.loc[(dataset['Age'] > 16) & (dataset['Age'] <= 32), 'Age_category'] = 1
    dataset.loc[(dataset['Age'] > 32) & (dataset['Age'] <= 48), 'Age_category'] = 2
    dataset.loc[(dataset['Age'] > 48) & (dataset['Age'] <= 64), 'Age_category'] = 3
    dataset.loc[ dataset['Age'] > 64, 'Age_category']=4
17.5.既存の属性データから新しい属性データを作成する。

・SibSp(兄弟、配偶者の数)とParch(両親、子供の数)を基にFamilySize(家族の数)の属性を作成する。

for dataset in combine:
    dataset['FamilySize']=dataset['SibSp']+dataset['Parch']+1
train_df[['FamilySize','Survived']].\
groupby(['FamilySize'],as_index=False).\
mean().sort_values(by='Survived',ascending=False)
'''出力
FamilySize	Survived
3	4	0.724138
2	3	0.578431
1	2	0.552795
6	7	0.333333
0	1	0.303538
4	5	0.200000
5	6	0.136364
7	8	0.000000
8	11	0.000000
'''

・IsAlone(独り身)の属性も作成する。

for dataset in combine:
    dataset['IsAlone']=0
    dataset.loc[dataset['FamilySize']==1,'IsAlone']=1

train_df[['IsAlone','Survived']].groupby(['IsAlone'],as_index=False).mean()
'''出力
   IsAlone	Survived
0	0	0.505650
1	1	0.303538
'''

・年齢と等級を組み合わせた人工的な属性を作成する。

for dataset in combine:
    dataset['Age*Class']=dataset.Age_category*dataset.Pclass
train_df.loc[:,['Age*Class','Age_category','Pclass']].head(10)
'''出力
Age*Class	Age_category	Pclass
0	3.0	1.0	3
1	2.0	2.0	1
2	3.0	1.0	3
3	2.0	2.0	1
4	6.0	2.0	3
5	3.0	1.0	3
6	3.0	3.0	1
7	0.0	0.0	3
8	3.0	1.0	3
9	0.0	0.0	2
'''
17.6.カテゴリカルデータを補完する。

・トレーニングデータのうち、Embarked(乗船した港)の属性が抜けているデータが2つある。
・最も一般的な値(mode)で埋める。

freq_port=train_df.Embarked.dropna().mode()[0]
freq_port
#出力:S

for dataset in combine:
    dataset['Embarked']=dataset['Embarked'].fillna(freq_port)
train_df[['Embarked','Survived']].groupby(['Embarked'], as_index=False).\
mean().sort_values(by='Survived',ascending=False)
'''出力
    Embarked	Survived
0	C	0.553571
1	Q	0.389610
2	S	0.339009
'''
17.6.カテゴリカルデータを数値に変換する。

・Embarked(乗船した港)の属性の値を数値に変換する。

for dataset in combine:
    dataset['Embarked']=dataset['Embarked'].map({'S':0,'C':1,'Q':2}).astype(int)
17.7 残りの数値属性の補完と変換を行う。

・Fare属性の値が一つ抜けているのでそれを中央値で補完する。

test_df['Fare'].fillna(test_df['Fare'].dropna().median(),inplace=True)

・Fareの範囲をpd.qcutで4つに分ける。

train_df['FareBand']=pd.qcut(train_df['Fare'],4)
train_df[['FareBand','Survived']].groupby(['FareBand'],as_index=False).\
mean().sort_values(by='FareBand',ascending=True)
'''出力
	FareBand	Survived
0	(-0.001, 7.91]	0.197309
1	(7.91, 14.454]	0.303571
2	(14.454, 31.0]	0.454955
3	(31.0, 512.329]	0.581081
'''

・Fareを順序尺度に変換する。

for dataset in combine:
    dataset.loc[ dataset['Fare'] <= 7.91, 'Fare'] = 0
    dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1
    dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare']   = 2
    dataset.loc[ dataset['Fare'] > 31, 'Fare'] = 3
    dataset['Fare'] = dataset['Fare'].astype(int)

train_df = train_df.drop(['FareBand'], axis=1)
combine = [train_df, test_df]

【備忘録】ax = ax or plt.gca()の記載の意味とPythonにおけるorの挙動

・以下の関数のax = ax or plt.gca()はaxの指定があればそれを適用し、指定が無ければmatplotlibによって作成するという意味。

def plot_something(data, ax=None, **kwargs):
    ax = ax or plt.gca()
    # Do some cool data transformations...
    return ax.boxplot(data, **kwargs)

引用元(ax = ax or plt.gca())
stackoverflow.com


Pythonにおける x or yの挙動は以下の通り。したがって、上記の関数では、ax=ax or plt.gca()が意図した通りに挙動する。

if bool(x):  # xの論理値がTrueなら
    return x  # yを見ることなく、しかもTrueではなくxそのものをリターン
else:  # xの論理値がFalseなら
    return y  # bool(y) ではなく、yそのものをリターン

引用元(Pythonのorの挙動)
qiita.com

【備忘録】WindowsでIPアドレスを確認する方法

コマンドプロンプトで「ipconfig」と入力して[Enter]キーを押す。
・表示されたIPv4アドレスまたはIPアドレス(IP Address)を確認する。

引用元↓
www.aterm.jp

【備忘録】matplotlibのaxes.flat や ax.flatの意味

axes.flat は関数ではなく、numpy.ndarrayの属性であり、numpy.ndarray.flatという意味。

numpy.ndarray.flatは配列(array)のイテレータになる。

詳しくはここ↓
stackoverflow.com