Начало работы с машинным обучением с помощью Python - часть 1

Целевая аудитория: новички, студенты.

Ключевые слова: Python3, начало работы, цикл for, цикл while, функции, словарь.

Машинное обучение - одна из самых быстрорастущих проблем в современном мире. С распространением технологий ИКТ все больше и больше исследователей, аналитиков данных, специалистов по обработке данных, студентов, предприятий используют Python для анализа данных, моделирования больших данных и машинного обучения [5, 1, 2].

Хотя в Интернете можно найти множество книг и видеоуроков, они либо очень сложны для понимания, либо платны. Когда я впервые начал свою карьеру в области машинного обучения и анализа данных, я боролся с множеством трудностей, связанных со сложностью доступных учебных пособий, а также с отсутствием пошаговых практических упражнений. В этой серии я собираюсь написать об использовании Python от абсолютных новичков до продвинутого моделирования данных и управления ими. Для этих серий я использую Python3. Это первое руководство из серии. Моя цель - в одной статье довести читателей от нуля до героя. В серию войдут следующие уроки:

  • Начало работы с Python (Часть 1)
  • Понимание структур данных в Python (часть 2)
  • Многомерные массивы и матрицы с использованием NumPy (Часть 3)
  • Концепция структур данных и анализа данных с использованием Pandas (Часть 4)
  • Расширенная визуализация с использованием matplotlib и seaborn (Часть 5)
  • Начало работы с линейной алгеброй (часть 6)
  • Начало работы с машинным обучением (часть 7)
  • Понимание обработки естественного языка с использованием NLTK (часть 8)
  • Методы глубокого обучения с использованием Tensorflow (часть 9)
  • Распознавание лиц с использованием OpenCV (часть 10)
  • Распознавание почерка (часть 11)
  • Другое (вероятно, будет использовать какой-либо набор данных с открытым доступом для применения ML)

Начало работы с Python

Установить Python довольно просто. Пользователи Windows и Mac могут загрузить необходимую версию с Домашней страницы Python. ОС, производная от Unix, имеет встроенную поддержку Python. Предлагаю посмотреть текущий список поддержки на домашней странице.

Как и в большинстве языков программирования, первое выражение, которое мы хотим вывести на экран, - это Hello World!. Python3 предоставляет функцию для вывода любого оператора на экран.

print("Hello World!"); 

Переменные

Каждый язык программирования определяет переменные, которые содержат определенные виды информации. Конкретный вид переменной называется data type. Важно знать тип данных переменной, поскольку он сообщает нам, какую информацию вы найдете внутри нее. Объявим переменную.

price = 489

Мы только что присвоили переменной цене значение 489. Точно так же мы можем хранить строковое значение.

disease = "Schizophrenia"

Вот некоторые основные типы переменных, которые необходимо понять на этом этапе:

  1. Числовой тип: могут быть целыми числами или числами с плавающей запятой. Любое целое число является целым. Возможно использование других оснований, кроме 10. Мы должны добавить к числу 0 и конкретную букву. Например, 0b100 - это значение один-ноль-ноль по основанию 2, то есть двоичное. У нас может быть основание 2 (двоичное), основание 8 (восьмеричное), основание 10 (десятичное), основание 16 (шестнадцатеричное). Любое число, обозначающее десятичную часть, является значением с плавающей запятой.
  2. Комплексные числа: мы можем объявить комплексное число в Python. complex = 4 + 5j. Чтобы увидеть реальную часть, мы можем получить доступ complex.real, а чтобы получить доступ к воображаемой части, мы можем получить доступ complex.imag. Довольно круто, верно.
  3. Логическое - True или False
  4. Нить
# String
name = "Ola Nordmann"
# Integer Value
age = 26
# Boolean Value
isMarried = True
# Floating Point value
averageExpense = 4578.89

Область действия переменной

Каждый раз, когда выполняется функция, создается локальная среда (пространство имен). Это локальное пространство имен содержит все переменные и имена параметров, которые назначаются функциями. Всякий раз, когда вызывается функция, Python Interpreter сначала смотрит в локальное пространство имен, которое является самой функцией - если совпадения не найдено, он смотрит в глобальное пространство имен. Если имя по-прежнему не найдено, выполняется поиск во встроенном пространстве имен. Если он не найден, интерпретатор вызовет aNameErrorexception. Рассмотрим следующий код:

a = 53
b = 7
def someFunction():
    global a
    a=110; b= 33
someFunction()
print(a)
print(b)
assert a == 110, 'a should be 110'
assert b == 7, 'b should not change.'

Операторы

Оператор принимает один или несколько входных данных в форме переменной или выражения и выполняет задачу, а затем предоставляет выходные данные. Следует помнить о следующих типах операторов:

  • Унарный: для ввода требуется одно значение или выражение. Например, (~, -, +) можно использовать как унарный оператор.
  • Арифметика: сложение (+), вычитание (-), умножение (*), деление (/), модуль (%), экспоненциальное (**), целочисленное деление (//).
  • Относительное: сравнивает одно значение с другим и предоставляет истину в виде результата. [==, !=, >, <, ≥, ≤] - некоторые из операторов отношения.
  • Логический: он объединяет истинное или ложное значение переменных или выражений для определения результирующего истинного значения. [and, or, not]
  • Задание: [=, +=, -=, *=, /=, **=, //=]
  • Членство: этот оператор определяет появление значения в списке или последовательности и затем выводит истинное значение этого появления. Два самых популярных оператора членства - это и not in.
  • Идентичность: это также уникально для Python. Двумя наиболее распространенными операторами идентификации являются is и is not..
  • Побитовые: (&, |, ^, ~, ‹*, ››) - побитовые операторы.

Пользовательский ввод

Python предоставляет удобную функцию input для приема пользовательского ввода. Использование простое:

value = input("Enter a number between 1 and 10:")
print(value)

Приведение типов

Пользовательский ввод всегда интерпретируется как строка. Часто перед их использованием требуется преобразовать значения в требуемый формат. Это называется приведением типов. В приведенном ниже примере мы преобразуем строку в число.

value = int(input("Enter a number between 1 and 10:"))
print(value)

Структуры потока управления

Структуры потока управления помогают принять решение. Оператор if - это простейший метод принятия решения в Python.

Давайте изучим структуру потока управления, используя оценку Beck Depression Inventory. Если человек страдает депрессией и обращается к терапевту, терапевт использует форму BDI для проверки уровня депрессии пациента. Форма BDI - это просто набор вопросов, к каждому ответу прилагается оценка. Общий балл рассчитывается для определения уровня депрессии. Вот таблица счёта:

Мы собираемся написать программу на Python, которая будет брать оценки у пользователя и сообщать им уровень депрессии.

score = int(input("Enter your BDI score"))

Теперь, чтобы принять решение, мы можем использовать if else структуру потока управления в Python.

score = int(input("Enter Your BDI Score:"))

if score >= 1 and score <= 10:
    print("These ups and downs are considered normal")
elif score >= 11 and score <= 16:
    print("Mild mood disturbance")
elif score >= 17 and score <= 20:
    print("Borderline clinical depression")
elif score >= 21 and score <= 30:
    print("Moderate depression")
elif score >= 31 and score <= 40:
    print("Severe depression")
elif score >= 41:
    print("Extreme depression")
else:
    print("Invalid Input")

Здесь нужно помнить о нескольких вещах. Я старался сделать код простым для удобства чтения и простоты. Обратите внимание на использование отступов вместо фигурных скобок, как в других программах. Ключевое слово elif вместо else if как в других программах.

Зацикливание

Loop позволяет выполнять повторяющиеся задачи. Давайте начнем с рассмотрения двух распространенных типов решений для циклов, предоставляемых Python for loop и while loop.

Допустим, мы хотим найти длину строки и проверить, больше ли ее длина 5 или нет.

inputString = "Therapist"
count = 0

for letter in inputString:
    print("Character is: ", letter)
    count = count + 1

if count > 5:
    print("String length is greater than 5.")
else:
    print("String length is less than or equal to 5")

Пока цикл

Давайте напишем программу, которая позволяет пользователю вводить набор чисел, и программа печатает сумму чисел, когда пользователь вводит done.

sum = 0
condition = True,

while condition:
    number = input("Enter next number:")
    print(number)
    if number == 'done':
        condition = False
    else:
        sum = sum + int(number)

print("Sum of all the numbers is:", sum)

Попробуйте запустить программу. Введите несколько чисел, а затем введите done. и посмотрите, правильно ли выводится сумма.

Контроль исполнения

Есть два способа контролировать выполнение цикла в операторах Python -continue, pass и break. Подсчитаем общее количество символов в слове Schizophrenia без символа o. Мы можем использовать оператор continue, чтобы продолжить выполнение цикла.

word = "schizophrenia"

count = 0
for character in word:
    if character is 'o':
        print("O found, not processed")
        continue

    count = count + 1
print("Total number of character without 0 is:", count)

Мы также можем использовать оператор break, чтобы завершить выполнение цикла. Давайте перепишем программу для вывода суммы пользовательских входов с помощью оператора break.

sum = 0

while True:
    number = raw_input("Enter next number:")
    print(number)
    if number == 'done':
        break
    else:
        sum = sum + int(number)

print("Sum of all the numbers is:", sum)

Функции

Создание функции на Python не требует особого труда. Мы можем создать функцию, используя ключевое слово def. Напечатаем Hellow World!, используя функцию.

def displayHelloWorld():
    print("Hello World!")
displayHelloWorld() # Hello World!

Это было не так уж и сложно !. Отступы работают как фигурные скобки. Обязательно сделайте отступ, чтобы начать фигурную скобку, и снимите отступ, чтобы указать конец фигурной скобки.

Аргументы в функции

Термин agrument означает, что вы предоставляете функции информацию, которая будет использоваться при обработке запроса. Давайте создадим функцию, которая принимает целое число в качестве аргумента и печатает квадрат числа.

def squared(number):
    return number * number

Возврат информации из функций

Функция не только что-то печатает, но также может возвращать кучу вещей. Вот некоторые типы данных, которые функция обычно возвращает вызывающей стороне:

Значения. Допускается любое значение. Вы можете возвращать числа, например 1 или 2,5; строки, такие как «Hello There!»; или логические значения, такие как True или False.

Переменные: содержимое любой переменной работает так же хорошо, как и прямое значение. Вызывающий получает данные, хранящиеся в переменной.

Выражения: многие разработчики используют выражения как ярлыки.

Результаты из других функций: вы можете фактически вернуть данные из другой функции как часть возврата вашей функции.

В приведенном выше фрагменте кода мы фактически вернули квадрат числа.

Списки

Спецификация Python определяет список как разновидность последовательности. Последовательности просто предоставляют некоторые средства, позволяющие нескольким элементам данных существовать вместе в одной единице хранения, но как отдельные объекты. Определим список психических заболеваний.

mental_diseases = [
 'Depression', 
 'Schizophrenia', 
 'Social Anxiety Disorder', 
 'ADHD', 
 'Bipolar Disorder', 
 'PTSD', 
 'OCD', 
 'Eating Disorder'
]

Общий список задач:

  • append: добавляет новую запись в конец списка.
  • clear: удаляет все записи из списка.
  • copy: Создает копию текущего списка.
  • extend: добавляет элементы из существующего списка в текущий список.
  • insert: добавляет новую запись в позицию, указанную в списке.
  • remove: удаляет запись из указанной позиции в списке.
  • задний ход
  • Сортировать
mental_diseases.pop() # removes 'Eating Disorder'
mental_diseases.index('Schizophrenia') #1
mental_diseases[1:3] # ['Schizophrenia', 'Social Anxiety Disorder']
mental_diseases.append('Acrophobia') # Adds `Acrophobia` to the list
len(mental_diseases) # 8

Словари

Создание и использование словаря очень похоже на работу со списком, за исключением того, что теперь вы должны определить пару ключ-значение. Вот особые правила создания ключа:

Ключ должен быть уникальным. Когда вы вводите повторяющийся ключ, информация, содержащаяся во второй записи, выигрывает - первая запись просто заменяется второй.

Ключ должен быть неизменным. Это правило означает, что вы можете использовать в качестве ключа строки, числа или кортежи. Однако вы не можете использовать список в качестве ключа.

Скажем, мы хотим сохранить запись о пациенте.

patient = {
    "name": "Ola Nordmann",
    "email": "[email protected]",
    "phone": "94430033",
    "sex": "Male",
    "case": "Depression"
}

Итерация по словарю

for item in patient.keys():
    print("{0} : {1}.".format(item, patient[item]))

dictionary представляет список содержащихся в нем ключей с использованием keys методов, как показано в приведенном выше фрагменте. Мы также можем получить доступ к отдельной паре ключ-значение из словаря.

patient["name"] # Ola Nordmann
patient["email"] # [email protected]

Обновление словаря аналогично обновлению списка.

patient["phone"] = "94430044"
patient.update({"phone": "94430044"})

Кортежи

Кортеж - это коллекция, используемая для создания сложных списков, в которых вы можете встроить один кортеж в другой.

color = ("Red", "Green", "Blue", "Brown")

Python представляет список функций, которые мы можем использовать с кортежами. Мы можем проверить их с помощью функции dir. Попробуйте вызвать эту функцию, как показано ниже:

dir(color)

Ваш результат должен быть примерно таким:

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']

Результат говорит о том, что мы можем добавить элемент в кортеж, используя метод __add__. Убедитесь, что вы проверили, как он принимает аргументы. Например, давайте попробуем использовать метод __add__, чтобы добавить цвет к кортежу.

color.__add__("Gold")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate tuple (not "str") to tuple

Ошибка говорит о том, что функция __add__() принимает в качестве входных данных только кортежи. Это означает, что вы должны заключить добавление в круглые скобки.

color.__add__(("Gold",))

Обработка ошибок

Ошибки могут возникать в определенное время - во время компиляции и во время выполнения. Ошибка времени компиляции возникает, когда вы просите Python запустить приложение. Ошибка выполнения возникает после того, как Python компилирует код, который вы пишете, и компьютер начинает его выполнять.

В основном есть три типа ошибок.

  • Синтаксическая ошибка: ошибка в синтаксисе языка.
  • Семантическая ошибка: ошибка в семантике программы, например, цикл, который выполняет дополнительное время, чем требуется.
  • Логическая ошибка: логические ошибки возникают, когда разработчик ошибается. Многие разработчики считают семантическую ошибку и логическую ошибку одним и тем же, но я предпочитаю разделять их.

Python предоставляет удобные способы обработки ошибок. Давайте использовать try...except

try:
    Value = int(input("Type a number between 1 and 10:"))
except ValueError:
    print("You must type a number between 1 and 10!")
else:
    if (Value > 0) and (Value <= 10):
        print("You typed: ", Value)
    else:
        print("The value you typed is incorrect!")

Давайте попросим пользователя ввести число от 1 до 10. Пользователь может попытаться сломать вашу программу, набрав алфавит, который не может быть преобразован в целое число. Следовательно, возникает исключение. Чтобы справиться с подобной ситуацией, мы можем использовать try except, как показано выше.

Объектно-ориентированная концепция

Я не могу охватить в этой статье всю концепцию ООП. Предполагая, что читатели знают об объектно-ориентированном программировании с другого языка программирования, я попытаюсь объяснить некоторые концепции ООП с использованием Python.

Если вы новичок в ООП, Предлагаю прочитать об этом здесь. Рекомендуется понимать концепцию класса, переменной класса, члена данных, перегрузки функции, наследования, экземпляра, создания экземпляра, объекта и перегрузки оператора.

В Python мы можем создать класс, используя ключевое слово class.

class Disease:
    def getName(self):
        print("Mental Health Diseases")


d1 = Disease()
d1.getName() # Mental Health Diseases

Здесь имя класса Disease.. В классе есть method с именем getName, который просто печатает текст.

Мы создали экземпляр класса с помощью d1 = Disease().. Мы создали экземпляр Disease с именем d1.. Этот экземпляр будет иметь доступ к функции-члену. Итак, мы вызвали функцию-член d1.getName(). . Все методы экземпляра принимают как минимум один аргумент, self. Аргумент самого себя указывает на конкретный экземпляр, который приложение использует для управления данными. Без аргумента self метод не знал бы, какие данные экземпляра использовать. Однако self не считается доступным аргументом - значение self предоставляется Python, и вы не можете изменить его при вызове метода.

Конструкторы

Конструктор - это особый вид метода, который Python вызывает, когда создает экземпляр объекта, используя определения, найденные в вашем классе.

class Disease:

    type = ""

    def __init__(self, disease = 'Depression'):
        self.type = disease


    def getName(self):
        print("Mental Health Diseases: {0}".format(self.type))


d1 = Disease('Social Anxiety Disorder')
d1.getName()
# Mental Health Diseases: Social Anxiety Disorder

Мы можем определить конструктор, используя __init__ метод, который принимает минимум один аргумент self. В приведенном выше коде мы определили переменную-член type, которая содержит пустую строку. В конструкторе мы просто присвоили значение disease, которое дает пользователь при создании экземпляра класса и имеет значение по умолчанию Depression.. Мы можем получить доступ к функции-члену с помощью d1.getName() и переменной-члену с помощью d1.type.

Методы со списками переменных аргументов

Фактические имена аргументов не имеют значения, но разработчики Python
используют *args и **kwargs в качестве соглашения, чтобы другие разработчики Python знали, что это переменный список аргументов. Обратите внимание, что с первым аргументом переменной связана только одна звездочка (*), что означает, что аргументы не имеют имени. Вторая переменная отмечена двумя звездочками, что означает, что аргументы названы.

class MentalDisease:
    def printList(self, *args):
        for Count, Item in enumerate(args): print("{0}. {1}".format(Count, Item))

    def prinPatienttInfo(self, **kwargs):
        if kwargs is not None:
            for key, value in kwargs.iteritems():
                print "%s : %s" % (key, value)

c1 = MentalDisease()
c1.printList("Depression", "Schizophrenia", "ADHD")
c1.prinPatienttInfo(name="Ola Nordmann", sex = "Male", age="45", country="Norway")

Результат сниппета должен выглядеть так:

0. Depression
1. Schizophrenia
2. ADHD
country : Norway
age : 45
name : Ola Nordmann
sex : Male

Наследование

Классы могут наследовать от других классов. Класс может наследовать атрибуты и методы поведения от другого класса, называемого суперклассом. Класс, который наследуется от суперкласса, называется подклассом, также называемым классом-наследником или дочерним классом. Суперклассы также иногда называют предками. Между классами существует иерархическая связь. Давайте разберемся с концепцией наследования на примере, приведенном ниже:

class Person:

    def __init__(self, first, last, email):
        self.firstname = first
        self.lastname = last
        self.email = email

    def getDetails(self):
        return self.firstname + " " + self.lastname + " " + self.email

class Employee(Person):

    def __init__(self, first, last, email, id):
        Person.__init__(self,first, last, email)
        self.id = id

    def GetEmployee(self):
        return self.getDetails() + ", " +  self.id

x = Person("Ola", "Nordmand", "[email protected]")
y = Employee("John", "Does", "[email protected]", "10909")

print(x.getDetails())
print(y.GetEmployee())

Мы определили два класса Person и Employee. Здесь Person - суперкласс, а Employee - подкласс. Результат программы должен выглядеть так:

Ola Nordmand [email protected]
John Does [email protected], 10909

Практические приемы

Уловка 1. Обращение за помощью

  • Python поставляется со справочной документацией. Чтобы войти в режим справки, введите help() и нажмите Enter.
  • После входа в режим справки вы можете проверить список доступных тем, просто введя команду topic.
  • Если вы хотите выучить function, просто введите тему и нажмите Enter. Чтобы выйти из режима справки, просто нажмите Enter, ничего не вводя.

Уловка 2: закрытие командной строки

Чтобы закрыть командную строку, вызовите функцию quite() или exit(). Вы также можете использовать библиотеку, например sys или os, для выхода из командной строки.

import sys
sys.exit()

Для выхода используйте os

import os
os._exit()

Уловка 3. Выбор редактора

Командная строка - хороший способ начать изучать Python, но не всегда удобна. Вы хотите сохранить свой сценарий. Существует множество редакторов, с помощью которых вы можете редактировать и запускать свой код Python. Лично я предпочитаю использовать Pycharm. У Джона Финчера есть хорошая статья о Python IDE.

Уловка 4. Различные способы проверки нескольких флагов

  • Мы можем назначить сразу несколько переменных.
a, b, c, d = 1, 3, 5, 7
  • Использование оператора in для проверки нескольких условий. Помните отрывок сверху:
if score >= 1 and score <= 10:
    print("These ups and downs are considered normal")

Вместо этого мы можем использовать оператор in, например:

if score in range(1, 11):
    print("These ups and downs are considered normal")

Итак, вместо того, чтобы сказать:

if a == 1 or b == 1 or c == 1:
   print("Found)

Мы можем сказать:

if 1 in (a, b, c):
   print("Found)

Также,

if a or b or c or d:
   print("Found")

Мы также можем сказать:

if any((a, b , c, d)):
   print("Found")

Дальнейшее чтение

Что ж, в этой статье я попытался провести вас с нуля до героя. Однако на этом вы еще не закончили. Вот некоторые из других областей, которые вы должны изучить, прежде чем углубляться во вторую статью:

  1. Обработка ошибок
  2. Вложенный цикл
  3. Регулярные выражения
  4. Изучение библиотек Python

Заключение

В этой статье мы узнали об основах Python от начала работы до создания простых структур данных, понимания структуры потока управления, повторения задачи с использованием цикла, создания возможности повторного использования кода по функциям. В следующей статье мы собираемся изучить некоторые из передовых методов структуры данных с использованием Python. Полная карта разума, которую вы должны построить, чтобы продолжить карьеру в области искусственного интеллекта, проиллюстрирована здесь.

использованная литература

  1. Https://realpython.com/
  2. Https://www.python.org/
  3. Lean Python Изучите Python достаточно, чтобы создавать полезные инструменты Авторы: Джеррард, Пол
  4. Python: путь от новичка к эксперту, Фабрицио Романо, Дасти Филлипс, Рик ван Хаттем
  5. Т. Е. Олифант, «Python для научных вычислений», в Вычисления в науке и технике, т. 9, вып. 3. С. 10–20, май-июнь 2007 г.
  6. Изучение Python: мощное объектно-ориентированное программирование Марк Лутц